Version 1.3.0-dev.3.0

svn merge -r 33322:33413 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@33414 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/dart.gyp b/dart.gyp
index 3a4b1ec..6723ce4 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -48,6 +48,8 @@
           'action_name': 'create_sdk_py',
           'inputs': [
             '<!@(["python", "tools/list_files.py", "\\.dart$", "sdk/lib"])',
+            '<!@(["python", "tools/list_files.py", "", '
+                '"sdk/lib/_internal/lib/preambles"])',
             '<!@(["python", "tools/list_files.py", "", "sdk/bin"])',
             'tools/create_sdk.py',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
diff --git a/pkg/analysis_server/lib/src/analysis_manager.dart b/pkg/analysis_server/lib/src/analysis_manager.dart
index 15f1e6b..ce7f787 100644
--- a/pkg/analysis_server/lib/src/analysis_manager.dart
+++ b/pkg/analysis_server/lib/src/analysis_manager.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -117,22 +118,25 @@
    */
   Future<bool> stop() {
     if (process == null) {
-      return new Future.value(false);
+      return channel.close().then((_) => false);
     }
-    var request = new Request('0', ServerDomainHandler.SHUTDOWN_METHOD);
-    channel.sendRequest(request);
-    return process.exitCode
-        .timeout(new Duration(seconds: 10))
-        .catchError((error) {
-          process.kill();
-          throw 'Expected server to shutdown';
+    return channel
+        .sendRequest(new Request('0', ServerDomainHandler.SHUTDOWN_METHOD))
+        .timeout(new Duration(seconds: 2), onTimeout: () {
+          print('Expected shutdown response');
         })
-        .then((result) {
-          if (result != 0) {
+        .then((Response response) {
+          return channel.close().then((_) => process.exitCode);
+        })
+        .timeout(new Duration(seconds: 2), onTimeout: () {
+          print('Expected server to shutdown');
+          process.kill();
+        })
+        .then((int result) {
+          if (result != null && result != 0) {
             exitCode = result;
           }
           return true;
         });
   }
-
 }
diff --git a/pkg/analysis_server/lib/src/channel.dart b/pkg/analysis_server/lib/src/channel.dart
index e9fc95d..85203b0 100644
--- a/pkg/analysis_server/lib/src/channel.dart
+++ b/pkg/analysis_server/lib/src/channel.dart
@@ -4,6 +4,7 @@
 
 library channel;
 
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
 
@@ -15,22 +16,28 @@
  * receive both [Response]s and [Notification]s.
  */
 abstract class ClientCommunicationChannel {
-  /**
-   * Listen to the channel for responses and notifications.
-   * If a response is received, invoke the [onResponse] function.
-   * If a notification is received, invoke the [onNotification] function.
-   * If an error is encountered while trying to read from
-   * the socket, invoke the [onError] function. If the socket is closed by the
-   * client, invoke the [onDone] function.
-   */
-  void listen(void onResponse(Response response),
-              void onNotification(Notification notification),
-              {void onError(), void onDone()});
 
   /**
-   * Send the given [request] to the server.
+   * The stream of notifications from the server.
    */
-  void sendRequest(Request request);
+  Stream<Notification> notificationStream;
+
+  /**
+   * The stream of responses from the server.
+   */
+  Stream<Response> responseStream;
+
+  /**
+   * Send the given [request] to the server
+   * and return a future with the associated [Response].
+   */
+  Future<Response> sendRequest(Request request);
+
+  /**
+   * Close the channel to the server. Once called, all future communication
+   * with the server via [sendRequest] will silently be ignored.
+   */
+  Future close();
 }
 
 /**
@@ -44,6 +51,7 @@
    * [onRequest] function. If an error is encountered while trying to read from
    * the socket, invoke the [onError] function. If the socket is closed by the
    * client, invoke the [onDone] function.
+   * Only one listener is allowed per channel.
    */
   void listen(void onRequest(Request request), {void onError(), void onDone()});
 
@@ -67,61 +75,43 @@
   /**
    * The socket being wrapped.
    */
-  final WebSocket socket;
-
-  final JsonEncoder jsonEncoder = const JsonEncoder(null);
-
-  final JsonDecoder jsonDecoder = const JsonDecoder(null);
-
-  /**
-   * Initialize a newly create [WebSocket] wrapper to wrap the given [socket].
-   */
-  WebSocketClientChannel(this.socket);
+  final WebSocket _socket;
 
   @override
-  void listen(void onResponse(Response response),
-              void onNotification(Notification notification),
-              {void onError(), void onDone()}) {
-    socket.listen((data) => _read(data, onResponse, onNotification),
-        onError: onError, onDone: onDone);
+  Stream<Response> responseStream;
+
+  @override
+  Stream<Notification> notificationStream;
+
+  /**
+   * Initialize a new [WebSocket] wrapper for the given [_socket].
+   */
+  WebSocketClientChannel(this._socket) {
+    Stream jsonStream = _socket
+        .where((data) => data is String)
+        .transform(new _JsonStreamDecoder())
+        .where((json) => json is Map)
+        .asBroadcastStream();
+    responseStream = jsonStream
+        .where((json) => json[Notification.EVENT] == null)
+        .transform(new _ResponseConverter())
+        .asBroadcastStream();
+    notificationStream = jsonStream
+        .where((json) => json[Notification.EVENT] != null)
+        .transform(new _NotificationConverter())
+        .asBroadcastStream();
   }
 
   @override
-  void sendRequest(Request request) {
-    socket.add(jsonEncoder.convert(request.toJson()));
+  Future<Response> sendRequest(Request request) {
+    String id = request.id;
+    _socket.add(JSON.encode(request.toJson()));
+    return responseStream.firstWhere((Response response) => response.id == id);
   }
 
-  /**
-   * Read a request from the given [data] and use the given function to handle
-   * the request.
-   */
-  void _read(Object data,
-             void onResponse(Response response),
-             void onNotification(Notification notification)) {
-    if (data is String) {
-      // Parse the string as a JSON descriptor
-      var json;
-      try {
-        json = jsonDecoder.convert(data);
-        if (json is! Map) {
-          return;
-        }
-      } catch (error) {
-        return;
-      }
-      // Process the resulting structure as a response or notification.
-      if (json[Notification.EVENT] != null) {
-        Notification notification = new Notification.fromJson(json);
-        if (notification != null) {
-          onNotification(notification);
-        }
-      } else {
-        Response response = new Response.fromJson(json);
-        if (response != null) {
-          onResponse(response);
-        }
-      }
-    }
+  @override
+  Future close() {
+    return _socket.close();
   }
 }
 
@@ -136,8 +126,6 @@
    */
   final WebSocket socket;
 
-  final JsonEncoder jsonEncoder = const JsonEncoder(null);
-
   /**
    * Initialize a newly create [WebSocket] wrapper to wrap the given [socket].
    */
@@ -151,12 +139,12 @@
 
   @override
   void sendNotification(Notification notification) {
-    socket.add(jsonEncoder.convert(notification.toJson()));
+    socket.add(JSON.encode(notification.toJson()));
   }
 
   @override
   void sendResponse(Response response) {
-    socket.add(jsonEncoder.convert(response.toJson()));
+    socket.add(JSON.encode(response.toJson()));
   }
 
   /**
@@ -180,3 +168,63 @@
     }
   }
 }
+
+/**
+ * Instances of [_JsonStreamDecoder] convert JSON strings to JSON maps
+ */
+class _JsonStreamDecoder extends Converter<String, Map> {
+
+  @override
+  Map convert(String text) => JSON.decode(text);
+
+  @override
+  ChunkedConversionSink startChunkedConversion(ChunkedConversionSink sink) =>
+      new _ChannelChunkSink<String, Map>(this, sink);
+}
+
+/**
+ * Instances of [_ResponseConverter] convert JSON maps to [Response]s.
+ */
+class _ResponseConverter extends Converter<Map, Response> {
+
+  @override
+  Response convert(Map json) => new Response.fromJson(json);
+
+  @override
+  ChunkedConversionSink startChunkedConversion(ChunkedConversionSink sink) =>
+      new _ChannelChunkSink<Map, Response>(this, sink);
+}
+
+/**
+ * Instances of [_NotificationConverter] convert JSON maps to [Notification]s.
+ */
+class _NotificationConverter extends Converter<Map, Notification> {
+
+  @override
+  Notification convert(Map json) => new Notification.fromJson(json);
+
+  @override
+  ChunkedConversionSink startChunkedConversion(ChunkedConversionSink sink) =>
+      new _ChannelChunkSink<Map, Notification>(this, sink);
+}
+
+/**
+ * A [_ChannelChunkSink] uses a [Convter] to translate chunks.
+ */
+class _ChannelChunkSink<S, T> extends ChunkedConversionSink<S> {
+  final Converter<S, T> _converter;
+  final ChunkedConversionSink _chunkedSink;
+
+  _ChannelChunkSink(this._converter, this._chunkedSink);
+
+  @override
+  void add(S chunk) {
+    var convertedChunk = _converter.convert(chunk);
+    if (convertedChunk != null) {
+      _chunkedSink.add(convertedChunk);
+    }
+  }
+
+  @override
+  void close() => _chunkedSink.close();
+}
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 1e37f24..3924d1a 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -109,8 +109,16 @@
     AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
     // TODO(brianwilkerson) Use the information from the request to set the
     // source factory in the context.
+    DirectoryBasedDartSdk sdk;
+    try {
+      sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDirectory));
+    } on Exception catch (e) {
+      // TODO what error code should be returned here?
+      return new Response(request.id, new RequestError(
+          RequestError.CODE_SDK_ERROR, 'Failed to access sdk: $e'));
+    }
     context.sourceFactory = new SourceFactory.con2([
-      new DartUriResolver(new DirectoryBasedDartSdk(new JavaFile(sdkDirectory))),
+      new DartUriResolver(sdk),
       new FileUriResolver(),
       // new PackageUriResolver(),
     ]);
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 0d39c31..8fbec36 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -73,14 +73,19 @@
       if (result is! Map) {
         return null;
       }
-      String id = result[Request.ID];
-      String method = result[Request.METHOD];
+      var id = result[Request.ID];
+      var method = result[Request.METHOD];
+      if (id is! String || method is! String) {
+        return null;
+      }
       var params = result[Request.PARAMS];
       Request request = new Request(id, method);
       if (params is Map) {
         params.forEach((String key, Object value) {
           request.setParameter(key, value);
         });
+      } else if (params != null) {
+        return null;
       }
       return request;
     } catch (exception) {
@@ -265,8 +270,10 @@
    */
   factory Response.fromJson(Map<String, Object> json) {
     try {
-      // TODO process result
-      String id = json[Response.ID];
+      var id = json[Response.ID];
+      if (id is! String) {
+        return null;
+      }
       var error = json[Response.ERROR];
       var result = json[Response.RESULT];
       Response response;
@@ -369,6 +376,11 @@
    */
   static const int CODE_INTERNAL_ERROR = -32603;
 
+  /**
+   * An error code indicating a problem using the specified Dart SDK.
+   */
+  static const int CODE_SDK_ERROR = -32603;
+
   /*
    * In addition, codes -32000 to -32099 indicate a server error. They are
    * reserved for implementation-defined server-errors.
diff --git a/pkg/analysis_server/test/channel_test.dart b/pkg/analysis_server/test/channel_test.dart
index 0c639ad..9658269 100644
--- a/pkg/analysis_server/test/channel_test.dart
+++ b/pkg/analysis_server/test/channel_test.dart
@@ -4,102 +4,154 @@
 
 library test.channel;
 
+import 'dart:async';
+
+import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/matcher.dart';
 import 'package:unittest/unittest.dart';
-import 'package:analysis_server/src/channel.dart';
+
 import 'mocks.dart';
 
 main() {
-  group('Channel', () {
-    test('invalidJsonToClient', ChannelTest.invalidJsonToClient);
-    test('invalidJsonToServer', ChannelTest.invalidJsonToServer);
-    test('notification', ChannelTest.notification);
-    test('request', ChannelTest.request);
-    test('response', ChannelTest.response);
+  group('WebSocketChannel', () {
+    setUp(WebSocketChannelTest.setUp);
+    test('close', WebSocketChannelTest.close);
+    test('invalidJsonToClient', WebSocketChannelTest.invalidJsonToClient);
+    test('invalidJsonToServer', WebSocketChannelTest.invalidJsonToServer);
+    test('notification', WebSocketChannelTest.notification);
+    test('notificationAndResponse', WebSocketChannelTest.notificationAndResponse);
+    test('request', WebSocketChannelTest.request);
+    test('requestResponse', WebSocketChannelTest.requestResponse);
+    test('response', WebSocketChannelTest.response);
   });
 }
 
-class ChannelTest {
+class WebSocketChannelTest {
+  static MockSocket socket;
+  static WebSocketClientChannel client;
+  static WebSocketServerChannel server;
 
-  static void invalidJsonToClient() {
-    InvalidJsonMockSocket mockSocket = new InvalidJsonMockSocket();
-    WebSocketClientChannel client = new WebSocketClientChannel(mockSocket);
-    var responsesReceived = new List();
-    var notificationsReceived = new List();
-    client.listen((Response response) => responsesReceived.add(response),
-        (Notification notification) => notificationsReceived.add(notification));
+  static List requestsReceived;
+  static List responsesReceived;
+  static List notificationsReceived;
 
-    mockSocket.addInvalid('"blat"');
-    mockSocket.addInvalid('{foo:bar}');
+  static void setUp() {
+    socket = new MockSocket.pair();
+    client = new WebSocketClientChannel(socket);
+    server = new WebSocketServerChannel(socket.twin);
 
-    expect(responsesReceived.length, equals(0));
-    expect(notificationsReceived.length, equals(0));
-    expect(mockSocket.responseCount, equals(0));
+    requestsReceived = [];
+    responsesReceived = [];
+    notificationsReceived = [];
+
+    // Allow multiple listeners on server side for testing.
+    socket.twin.allowMultipleListeners();
+
+    server.listen(requestsReceived.add);
+    client.responseStream.listen(responsesReceived.add);
+    client.notificationStream.listen(notificationsReceived.add);
   }
 
-  static void invalidJsonToServer() {
-    InvalidJsonMockSocket mockSocket = new InvalidJsonMockSocket();
-    WebSocketServerChannel server = new WebSocketServerChannel(mockSocket);
-    var received = new List();
-    server.listen((Request request) => received.add(request));
-
-    mockSocket.addInvalid('"blat"');
-    mockSocket.addInvalid('{foo:bar}');
-
-    expect(received.length, equals(0));
-    expect(mockSocket.responseCount, equals(2));
+  static Future close() {
+    var timeout = new Duration(seconds: 1);
+    var future = client.responseStream.drain().timeout(timeout);
+    client.close();
+    return future;
   }
 
-  static void notification() {
-    MockSocket mockSocket = new MockSocket();
-    WebSocketClientChannel client = new WebSocketClientChannel(mockSocket);
-    WebSocketServerChannel server = new WebSocketServerChannel(mockSocket);
-    var responsesReceived = new List();
-    var notificationsReceived = new List();
-    client.listen((Response response) => responsesReceived.add(response),
-        (Notification notification) => notificationsReceived.add(notification));
+  static Future invalidJsonToClient() {
+    socket.twin.add('{"foo":"bar"}');
+    server.sendResponse(new Response('myId'));
+    return client.responseStream
+        .first
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('myId'));
+          expectMsgCount(responseCount: 1);
+        });
+  }
 
+  static Future invalidJsonToServer() {
+    socket.add('"blat"');
+    return client.responseStream
+        .first
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals(''));
+          expect(response.error, isNotNull);
+          expectMsgCount(responseCount: 1);
+        });
+  }
+
+  static Future notification() {
     server.sendNotification(new Notification('myEvent'));
+    return client.notificationStream
+        .first
+        .timeout(new Duration(seconds: 1))
+        .then((Notification notification) {
+          expect(notification.event, equals('myEvent'));
+          expectMsgCount(notificationCount: 1);
 
-    expect(responsesReceived.length, equals(0));
-    expect(notificationsReceived.length, equals(1));
-    expect(notificationsReceived.first.runtimeType, equals(Notification));
-    Notification actual = notificationsReceived.first;
-    expect(actual.event, equals('myEvent'));
+          expect(notificationsReceived.first, equals(notification));
+        });
+  }
+
+  static Future notificationAndResponse() {
+    server
+        ..sendNotification(new Notification('myEvent'))
+        ..sendResponse(new Response('myId'));
+    return Future
+        .wait([
+          client.notificationStream.first,
+          client.responseStream.first])
+        .timeout(new Duration(seconds: 1))
+        .then((_) => expectMsgCount(responseCount: 1, notificationCount: 1));
   }
 
   static void request() {
-    MockSocket mockSocket = new MockSocket();
-    WebSocketClientChannel client = new WebSocketClientChannel(mockSocket);
-    WebSocketServerChannel server = new WebSocketServerChannel(mockSocket);
-    var requestsReceived = new List();
-    server.listen((Request request) => requestsReceived.add(request));
-
-    client.sendRequest(new Request('myId', 'aMethod'));
-
-    expect(requestsReceived.length, equals(1));
-    expect(requestsReceived.first.runtimeType, equals(Request));
-    Request actual = requestsReceived.first;
-    expect(actual.id, equals('myId'));
-    expect(actual.method, equals('aMethod'));
+    client.sendRequest(new Request('myId', 'myMth'));
+    server.listen((Request request) {
+      expect(request.id, equals('myId'));
+      expect(request.method, equals('myMth'));
+      expectMsgCount(requestCount: 1);
+    });
   }
 
-  static void response() {
-    MockSocket mockSocket = new MockSocket();
-    WebSocketClientChannel client = new WebSocketClientChannel(mockSocket);
-    WebSocketServerChannel server = new WebSocketServerChannel(mockSocket);
-    var responsesReceived = new List();
-    var notificationsReceived = new List();
-    client.listen((Response response) => responsesReceived.add(response),
-        (Notification notification) => notificationsReceived.add(notification));
+  static Future requestResponse() {
+    // Simulate server sending a response by echoing the request.
+    server.listen((Request request) =>
+        server.sendResponse(new Response(request.id)));
+    return client.sendRequest(new Request('myId', 'myMth'))
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('myId'));
+          expectMsgCount(requestCount: 1, responseCount: 1);
 
+          expect(requestsReceived.first is Request, isTrue);
+          Request request = requestsReceived.first;
+          expect(request.id, equals('myId'));
+          expect(request.method, equals('myMth'));
+          expect(responsesReceived.first, equals(response));
+        });
+  }
+
+  static Future response() {
     server.sendResponse(new Response('myId'));
+    return client.responseStream
+        .first
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('myId'));
+          expectMsgCount(responseCount: 1);
+        });
+  }
 
-    expect(responsesReceived.length, equals(1));
-    expect(notificationsReceived.length, equals(0));
-    expect(responsesReceived.first.runtimeType, equals(Response));
-    Response actual = responsesReceived.first;
-    expect(actual.id, equals('myId'));
+  static void expectMsgCount({requestCount: 0,
+                              responseCount: 0,
+                              notificationCount: 0}) {
+    expect(requestsReceived, hasLength(requestCount));
+    expect(responsesReceived, hasLength(responseCount));
+    expect(notificationsReceived, hasLength(notificationCount));
   }
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 1c87b0e..7b898cb 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -4,35 +4,45 @@
 
 library mocks;
 
-import 'dart:io';
 import 'dart:async';
+import 'dart:io';
 
 /**
- * A mock [WebSocket] that immediately passes data to the listener.
+ * A mock [WebSocket] for testing.
  */
 class MockSocket<T> implements WebSocket {
-  var onData;
-  StreamSubscription<T> listen(void onData(T event),
-                     {Function onError, void onDone(), bool cancelOnError}) {
-    this.onData = onData;
-    return null;
+
+  StreamController controller = new StreamController();
+  MockSocket twin;
+  Stream stream;
+
+  factory MockSocket.pair() {
+    MockSocket socket1 = new MockSocket();
+    MockSocket socket2 = new MockSocket();
+    socket1.twin = socket2;
+    socket2.twin = socket1;
+    socket1.stream = socket2.controller.stream;
+    socket2.stream = socket1.controller.stream;
+    return socket1;
   }
-  void add(T event) => onData(event);
+
+  MockSocket();
+
+  void add(T text) => controller.add(text);
+
+  void allowMultipleListeners() {
+    stream = stream.asBroadcastStream();
+  }
+
+  Future close([int code, String reason]) => controller.close()
+      .then((_) => twin.controller.close());
+
+  StreamSubscription<T> listen(void onData(T event),
+                     { Function onError, void onDone(), bool cancelOnError}) =>
+    stream.listen(onData, onError: onError, onDone: onDone,
+        cancelOnError: cancelOnError);
+
+  Stream<T> where(bool test(T)) => stream.where(test);
+
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
-
-/**
- * A mock [WebSocket] for sending invalid JSON data and counting responses.
- */
-class InvalidJsonMockSocket<T> implements WebSocket {
-  int responseCount = 0;
-  var onData;
-  StreamSubscription<T> listen(void onData(T event),
-                     {Function onError, void onDone(), bool cancelOnError}) {
-    this.onData = onData;
-    return null;
-  }
-  void addInvalid(T event) => onData(event);
-  void add(T event) { responseCount++; }
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 5d6fd71..ae5eac9 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -22,6 +22,9 @@
     test('getRequiredParameter_defined', RequestTest.getRequiredParameter_defined);
     test('getRequiredParameter_undefined', RequestTest.getRequiredParameter_undefined);
     test('fromJson', RequestTest.fromJson);
+    test('fromJson_invalidId', RequestTest.fromJson_invalidId);
+    test('fromJson_invalidMethod', RequestTest.fromJson_invalidMethod);
+    test('fromJson_invalidParams', RequestTest.fromJson_invalidParams);
     test('fromJson_withParams', RequestTest.fromJson_withParams);
     test('toJson', RequestTest.toJson);
     test('toJson_withParams', RequestTest.toJson_withParams);
@@ -110,16 +113,34 @@
 
   static void fromJson() {
     Request original = new Request('one', 'aMethod');
-    String json = new JsonEncoder(null).convert(original.toJson());
+    String json = JSON.encode(original.toJson());
     Request request = new Request.fromString(json);
     expect(request.id, equals('one'));
     expect(request.method, equals('aMethod'));
   }
 
+  static void fromJson_invalidId() {
+    String json = '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  static void fromJson_invalidMethod() {
+    String json = '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  static void fromJson_invalidParams() {
+    String json = '{"id":"one","method":"aMethod","params":"foobar"}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
   static void fromJson_withParams() {
     Request original = new Request('one', 'aMethod');
     original.setParameter('foo', 'bar');
-    String json = new JsonEncoder(null).convert(original.toJson());
+    String json = JSON.encode(original.toJson());
     Request request = new Request.fromString(json);
     expect(request.id, equals('one'));
     expect(request.method, equals('aMethod'));
diff --git a/pkg/analyzer/example/resolver_driver.dart b/pkg/analyzer/example/resolver_driver.dart
index c139354..679f16a 100644
--- a/pkg/analyzer/example/resolver_driver.dart
+++ b/pkg/analyzer/example/resolver_driver.dart
@@ -30,7 +30,7 @@
   Source source = new FileBasedSource.con1(new JavaFile(args[1]));
   //
   ChangeSet changeSet = new ChangeSet();
-  changeSet.added(source);
+  changeSet.addedSource(source);
   context.applyChanges(changeSet);
   LibraryElement libElement = context.computeLibraryElement(source);
   print("libElement: $libElement");
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 4cfeec2..bf07ccc 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -2584,7 +2584,7 @@
    * @param references the references embedded within the documentation comment
    * @return the documentation comment that was created
    */
-  static Comment createDocumentationComment2(List<Token> tokens, List<CommentReference> references) => new Comment(tokens, CommentType.DOCUMENTATION, references);
+  static Comment createDocumentationCommentWithReferences(List<Token> tokens, List<CommentReference> references) => new Comment(tokens, CommentType.DOCUMENTATION, references);
 
   /**
    * Create an end-of-line comment.
@@ -4166,10 +4166,12 @@
 
   accept(AstVisitor visitor) => visitor.visitExportDirective(this);
 
+  ExportElement get element => super.element as ExportElement;
+
   LibraryElement get uriElement {
-    Element element = this.element;
-    if (element is ExportElement) {
-      return element.exportedLibrary;
+    ExportElement exportElement = element;
+    if (exportElement != null) {
+      return exportElement.exportedLibrary;
     }
     return null;
   }
@@ -12095,7 +12097,7 @@
    * @param offset the offset relative to source
    * @return the associated element, or `null` if none is found
    */
-  static Element locate2(AstNode node, int offset) {
+  static Element locateWithOffset(AstNode node, int offset) {
     // try to get Element from node
     {
       Element nodeElement = locate(node);
@@ -14560,7 +14562,7 @@
 
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
-      return Comment.createDocumentationComment2(node.tokens, cloneNodeList(node.references));
+      return Comment.createDocumentationCommentWithReferences(node.tokens, cloneNodeList(node.references));
     } else if (node.isBlock) {
       return Comment.createBlockComment(node.tokens);
     }
@@ -14785,7 +14787,7 @@
    * @param second the second node being compared
    * @return `true` if the two AST nodes are equal
    */
-  static bool equals4(CompilationUnit first, CompilationUnit second) {
+  static bool equalUnits(CompilationUnit first, CompilationUnit second) {
     AstComparator comparator = new AstComparator();
     return comparator.isEqualNodes(first, second);
   }
@@ -15508,7 +15510,7 @@
 
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
-      return Comment.createDocumentationComment2(mapTokens(node.tokens), cloneNodeList(node.references));
+      return Comment.createDocumentationCommentWithReferences(mapTokens(node.tokens), cloneNodeList(node.references));
     } else if (node.isBlock) {
       return Comment.createBlockComment(mapTokens(node.tokens));
     }
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 680f057..e998954 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -155,7 +155,7 @@
    *
    * @return `true` if this object's value can be represented exactly
    */
-  bool hasExactValue();
+  bool get hasExactValue;
 
   /**
    * Return `true` if this object represents the value 'false'.
@@ -1853,7 +1853,7 @@
 
   String get typeName => "bool";
 
-  bool hasExactValue() => true;
+  bool get hasExactValue => true;
 
   int get hashCode => value == null ? 0 : (value ? 2 : 3);
 
@@ -2098,7 +2098,7 @@
    */
   DartObjectImpl greaterThanOrEqual(TypeProvider typeProvider, DartObjectImpl rightOperand) => new DartObjectImpl(typeProvider.boolType, _state.greaterThanOrEqual(rightOperand._state));
 
-  bool hasExactValue() => _state.hasExactValue();
+  bool get hasExactValue => _state.hasExactValue;
 
   int get hashCode => ObjectUtilities.combineHashCodes(type.hashCode, _state.hashCode);
 
@@ -2476,7 +2476,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
-  bool hasExactValue() => true;
+  bool get hasExactValue => true;
 
   int get hashCode => value == null ? 0 : value.hashCode;
 
@@ -3069,7 +3069,7 @@
    *
    * @return `true` if this object's value can be represented exactly
    */
-  bool hasExactValue() => false;
+  bool get hasExactValue => false;
 
   /**
    * Return the result of invoking the '~/' operator on this object with the given argument.
@@ -3516,7 +3516,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
-  bool hasExactValue() => true;
+  bool get hasExactValue => true;
 
   int get hashCode => value == null ? 0 : value.hashCode;
 
@@ -3777,7 +3777,7 @@
     List<Object> result = new List<Object>(count);
     for (int i = 0; i < count; i++) {
       DartObjectImpl element = _elements[i];
-      if (!element.hasExactValue()) {
+      if (!element.hasExactValue) {
         return null;
       }
       result[i] = element.value;
@@ -3785,10 +3785,10 @@
     return result;
   }
 
-  bool hasExactValue() {
+  bool get hasExactValue {
     int count = _elements.length;
     for (int i = 0; i < count; i++) {
-      if (!_elements[i].hasExactValue()) {
+      if (!_elements[i].hasExactValue) {
         return false;
       }
     }
@@ -3863,7 +3863,7 @@
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
       DartObjectImpl key = entry.getKey();
       DartObjectImpl value = entry.getValue();
-      if (!key.hasExactValue() || !value.hasExactValue()) {
+      if (!key.hasExactValue || !value.hasExactValue) {
         return null;
       }
       result[key.value] = value.value;
@@ -3871,9 +3871,9 @@
     return result;
   }
 
-  bool hasExactValue() {
+  bool get hasExactValue {
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
-      if (!entry.getKey().hasExactValue() || !entry.getValue().hasExactValue()) {
+      if (!entry.getKey().hasExactValue || !entry.getValue().hasExactValue) {
         return false;
       }
     }
@@ -3916,7 +3916,7 @@
 
   String get typeName => "Null";
 
-  bool hasExactValue() => true;
+  bool get hasExactValue => true;
 
   int get hashCode => 0;
 
@@ -4080,7 +4080,7 @@
 
   String get typeName => "String";
 
-  bool hasExactValue() => true;
+  bool get hasExactValue => true;
 
   int get hashCode => value == null ? 0 : value.hashCode;
 
@@ -4134,7 +4134,7 @@
 
   String get typeName => "Symbol";
 
-  bool hasExactValue() => true;
+  bool get hasExactValue => true;
 
   int get hashCode => value == null ? 0 : value.hashCode;
 
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 8c2beda..9e13d86 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -192,7 +192,7 @@
    *
    * @return `true` if this class or its superclass declares a non-final instance field
    */
-  bool hasNonFinalField();
+  bool get hasNonFinalField;
 
   /**
    * Return `true` if this class has reference to super (so, for example, cannot be used as a
@@ -200,7 +200,7 @@
    *
    * @return `true` if this class has reference to super
    */
-  bool hasReferenceToSuper();
+  bool get hasReferenceToSuper;
 
   /**
    * Return `true` if this class is abstract. A class is abstract if it has an explicit
@@ -1336,7 +1336,7 @@
    * Return `true` if the defining compilation unit of this library contains at least one
    * import directive whose URI uses the "dart-ext" scheme.
    */
-  bool hasExtUri();
+  bool get hasExtUri;
 
   /**
    * Return `true` if this library is created for Angular analysis. If this library has not
@@ -1374,7 +1374,7 @@
    * @param timeStamp the time stamp to compare against
    * @return `true` if this library is up to date with respect to the given time stamp
    */
-  bool isUpToDate2(int timeStamp);
+  bool isUpToDate(int timeStamp);
 }
 
 /**
@@ -2618,7 +2618,7 @@
     return null;
   }
 
-  ClassDeclaration get node => getNode2((node) => node is ClassDeclaration);
+  ClassDeclaration get node => getNodeMatching((node) => node is ClassDeclaration);
 
   PropertyAccessorElement getSetter(String setterName) {
     // TODO (jwren) revisit- should we append '=' here or require clients to include it?
@@ -2648,7 +2648,7 @@
     return null;
   }
 
-  bool hasNonFinalField() {
+  bool get hasNonFinalField {
     List<ClassElement> classesToVisit = new List<ClassElement>();
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     classesToVisit.add(this);
@@ -2680,7 +2680,7 @@
     return false;
   }
 
-  bool hasReferenceToSuper() => hasModifier(Modifier.REFERENCES_SUPER);
+  bool get hasReferenceToSuper => hasModifier(Modifier.REFERENCES_SUPER);
 
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
@@ -2830,7 +2830,7 @@
    *
    * @param isReferencedSuper `true` references 'super'
    */
-  void set hasReferenceToSuper2(bool isReferencedSuper) {
+  void set hasReferenceToSuper(bool isReferencedSuper) {
     setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
   }
 
@@ -3329,7 +3329,7 @@
 
   ElementKind get kind => ElementKind.CONSTRUCTOR;
 
-  ConstructorDeclaration get node => getNode2((node) => node is ConstructorDeclaration);
+  ConstructorDeclaration get node => getNodeMatching((node) => node is ConstructorDeclaration);
 
   bool get isConst => hasModifier(Modifier.CONST);
 
@@ -3655,7 +3655,7 @@
 
   String get name => _name;
 
-  AstNode get node => getNode2((node) => node is AstNode);
+  AstNode get node => getNodeMatching((node) => node is AstNode);
 
   Source get source {
     if (_enclosingElement == null) {
@@ -3765,7 +3765,7 @@
   /**
    * Return the resolved [AstNode] of the given type enclosing [getNameOffset].
    */
-  AstNode getNode2(Predicate<AstNode> predicate) {
+  AstNode getNodeMatching(Predicate<AstNode> predicate) {
     CompilationUnit unit = this.unit;
     if (unit == null) {
       return null;
@@ -3784,7 +3784,7 @@
    * @param modifier the modifier being tested for
    * @return `true` if this element has the given modifier associated with it
    */
-  bool hasModifier(Modifier modifier) => BooleanArray.get(_modifiers, modifier);
+  bool hasModifier(Modifier modifier) => BooleanArray.getEnum(_modifiers, modifier);
 
   /**
    * If the given child is not `null`, use the given visitor to visit it.
@@ -3829,7 +3829,7 @@
    * @param value `true` if the modifier is to be associated with this element
    */
   void setModifier(Modifier modifier, bool value) {
-    _modifiers = BooleanArray.set(_modifiers, modifier, value);
+    _modifiers = BooleanArray.setEnum(_modifiers, modifier, value);
   }
 }
 
@@ -4466,7 +4466,7 @@
 
   ElementKind get kind => ElementKind.FUNCTION;
 
-  FunctionDeclaration get node => getNode2((node) => node is FunctionDeclaration);
+  FunctionDeclaration get node => getNodeMatching((node) => node is FunctionDeclaration);
 
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
@@ -4558,7 +4558,7 @@
 
   ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
 
-  FunctionTypeAlias get node => getNode2((node) => node is FunctionTypeAlias);
+  FunctionTypeAlias get node => getNodeMatching((node) => node is FunctionTypeAlias);
 
   List<ParameterElement> get parameters => _parameters;
 
@@ -4908,7 +4908,7 @@
    * @param timeStamp the time stamp to check against
    * @param visitedLibraries the set of visited libraries
    */
-  static bool isUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
+  static bool safeIsUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
     if (!visitedLibraries.contains(library)) {
       visitedLibraries.add(library);
       AnalysisContext context = library.context;
@@ -4924,13 +4924,13 @@
       }
       // Check the imported libraries.
       for (LibraryElement importedLibrary in library.importedLibraries) {
-        if (!isUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
+        if (!safeIsUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
           return false;
         }
       }
       // Check the exported libraries.
       for (LibraryElement exportedLibrary in library.exportedLibraries) {
-        if (!isUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
+        if (!safeIsUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
           return false;
         }
       }
@@ -5087,7 +5087,7 @@
     return new List.from(visibleLibraries);
   }
 
-  bool hasExtUri() => hasModifier(Modifier.HAS_EXT_URI);
+  bool get hasExtUri => hasModifier(Modifier.HAS_EXT_URI);
 
   int get hashCode => _definingCompilationUnit.hashCode;
 
@@ -5099,9 +5099,9 @@
 
   bool get isInSdk => StringUtilities.startsWith5(name, 0, 0x64, 0x61, 0x72, 0x74, 0x2E);
 
-  bool isUpToDate2(int timeStamp) {
+  bool isUpToDate(int timeStamp) {
     Set<LibraryElement> visitedLibraries = new Set();
-    return isUpToDate(this, timeStamp, visitedLibraries);
+    return safeIsUpToDate(this, timeStamp, visitedLibraries);
   }
 
   /**
@@ -5138,7 +5138,7 @@
    *
    * @param hasExtUri `true` if this library has an import of a "dart-ext" URI
    */
-  void set hasExtUri2(bool hasExtUri) {
+  void set hasExtUri(bool hasExtUri) {
     setModifier(Modifier.HAS_EXT_URI, hasExtUri);
   }
 
@@ -5387,7 +5387,7 @@
     return super.name;
   }
 
-  MethodDeclaration get node => getNode2((node) => node is MethodDeclaration);
+  MethodDeclaration get node => getNodeMatching((node) => node is MethodDeclaration);
 
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
@@ -6003,10 +6003,10 @@
       return null;
     }
     if (enclosingElement is ClassElement) {
-      return getNode2((node) => node is MethodDeclaration);
+      return getNodeMatching((node) => node is MethodDeclaration);
     }
     if (enclosingElement is CompilationUnitElement) {
-      return getNode2((node) => node is FunctionDeclaration);
+      return getNodeMatching((node) => node is FunctionDeclaration);
     }
     return null;
   }
@@ -6269,7 +6269,7 @@
 
   FunctionElement get initializer => _initializer;
 
-  VariableDeclaration get node => getNode2((node) => node is VariableDeclaration);
+  VariableDeclaration get node => getNodeMatching((node) => node is VariableDeclaration);
 
   bool get isConst => hasModifier(Modifier.CONST);
 
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 49d701e..d536acb 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -224,6 +224,8 @@
    * 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
+   *
    * @param source the source whose errors are to be returned
    * @return all of the errors associated with the given source
    * @throws AnalysisException if the errors could not be determined because the analysis could not
@@ -239,6 +241,8 @@
    * 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
+   *
    * @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
    * @throws AnalysisException if the element model could not be determined because the analysis
@@ -251,6 +255,8 @@
    * 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
+   *
    * @param source the source whose kind is to be returned
    * @return the kind of the given source
    * @see #getKindOf(Source)
@@ -277,6 +283,8 @@
    * 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
+   *
    * @param source the source whose line information is to be returned
    * @return the line information for the given source
    * @throws AnalysisException if the line information could not be determined because the analysis
@@ -343,9 +351,9 @@
   /**
    * Get the contents of the given source and pass it to the given content receiver.
    *
-   * This method should be used rather than the method [Source#getContentsToReceiver]
-   * because contexts can have local overrides of the content of a source that the source is not
-   * aware of.
+   * This method should be used rather than the method
+   * [Source#getContentsToReceiver] because contexts can have local overrides
+   * of the content of a source that the source is not aware of.
    *
    * @param source the source whose content is to be returned
    * @param receiver the content receiver to which the content of the source will be passed
@@ -596,6 +604,8 @@
    * 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
+   *
    * @param source the source to be parsed
    * @return the AST structure representing the content of the source
    * @throws AnalysisException if the analysis could not be performed
@@ -607,6 +617,8 @@
    * 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
+   *
    * @param source the HTML source to be parsed
    * @return the parse result (not `null`)
    * @throws AnalysisException if the analysis could not be performed
@@ -914,17 +926,17 @@
   /**
    * A list containing the sources that have been added.
    */
-  final List<Source> added3 = new List<Source>();
+  List<Source> _added = new List<Source>();
 
   /**
    * A list containing the sources that have been changed.
    */
-  final List<Source> changed3 = new List<Source>();
+  List<Source> _changed = new List<Source>();
 
   /**
    * A list containing the sources that have been removed.
    */
-  final List<Source> removed3 = new List<Source>();
+  List<Source> _removed = new List<Source>();
 
   /**
    * A list containing the source containers specifying additional sources that have been removed.
@@ -937,8 +949,8 @@
    *
    * @param source the source that was added
    */
-  void added(Source source) {
-    added3.add(source);
+  void addedSource(Source source) {
+    _added.add(source);
   }
 
   /**
@@ -947,27 +959,37 @@
    *
    * @param source the source that was changed
    */
-  void changed(Source source) {
-    changed3.add(source);
+  void changedSource(Source source) {
+    _changed.add(source);
   }
 
   /**
+   * Return a collection of the sources that have been added.
+   *
+   * @return a collection of the sources that have been added
+   */
+  List<Source> get addedSources => _added;
+
+  /**
+   * Return a collection of sources that have been changed.
+   *
+   * @return a collection of sources that have been changed
+   */
+  List<Source> get changedSources => _changed;
+
+  /**
+   * Return a list containing the sources that were removed.
+   *
+   * @return a list containing the sources that were removed
+   */
+  List<Source> get removedSources => _removed;
+
+  /**
    * Return `true` if this change set does not contain any changes.
    *
    * @return `true` if this change set does not contain any changes
    */
-  bool get isEmpty => added3.isEmpty && changed3.isEmpty && removed3.isEmpty && removedContainers.isEmpty;
-
-  /**
-   * Record that the specified source has been removed.
-   *
-   * @param source the source that was removed
-   */
-  void removed(Source source) {
-    if (source != null) {
-      removed3.add(source);
-    }
-  }
+  bool get isEmpty => _added.isEmpty && _changed.isEmpty && _removed.isEmpty && removedContainers.isEmpty;
 
   /**
    * Record that the specified source container has been removed.
@@ -980,14 +1002,25 @@
     }
   }
 
+  /**
+   * Record that the specified source has been removed.
+   *
+   * @param source the source that was removed
+   */
+  void removedSource(Source source) {
+    if (source != null) {
+      _removed.add(source);
+    }
+  }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSeparator = appendSources(builder, added3, false, "added");
-    needsSeparator = appendSources(builder, changed3, needsSeparator, "changed");
-    appendSources(builder, removed3, needsSeparator, "removed");
+    bool needsSeparator = appendSources(builder, _added, false, "added");
+    needsSeparator = appendSources(builder, _changed, needsSeparator, "changed");
+    appendSources(builder, _removed, needsSeparator, "removed");
     int count = removedContainers.length;
     if (count > 0) {
-      if (removed3.isEmpty) {
+      if (_removed.isEmpty) {
         if (needsSeparator) {
           builder.append("; ");
         }
@@ -1456,7 +1489,7 @@
    *          context for the data
    * @return the value of the data represented by the given descriptor and library
    */
-  CacheState getState2(DataDescriptor descriptor, Source librarySource);
+  CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource);
 
   /**
    * Return the value of the data represented by the given descriptor in the context of the given
@@ -1467,7 +1500,7 @@
    *          context for the data
    * @return the value of the data represented by the given descriptor and library
    */
-  Object getValue2(DataDescriptor descriptor, Source librarySource);
+  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource);
 
   DartEntryImpl get writableCopy;
 
@@ -1732,7 +1765,7 @@
 
   /**
    * Return a compilation unit that has not been accessed by any other client and can therefore
-   * safely be modified by the reconciler.
+   * safely be modified by the reconciler, or `null` if the source has not been parsed.
    *
    * @return a compilation unit that can be modified by the reconciler
    */
@@ -1788,7 +1821,7 @@
     }
   }
 
-  CacheState getState2(DataDescriptor descriptor, Source librarySource) {
+  CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       if (librarySource == state._librarySource) {
@@ -1828,9 +1861,9 @@
     } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
       return _includedParts;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      return BooleanArray.get2(_bitmask, _CLIENT_CODE_INDEX);
+      return BooleanArray.get(_bitmask, _CLIENT_CODE_INDEX);
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      return BooleanArray.get2(_bitmask, _LAUNCHABLE_INDEX);
+      return BooleanArray.get(_bitmask, _LAUNCHABLE_INDEX);
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       return _parseErrors;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
@@ -1848,7 +1881,7 @@
     return super.getValue(descriptor);
   }
 
-  Object getValue2(DataDescriptor descriptor, Source librarySource) {
+  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       if (librarySource == state._librarySource) {
@@ -2222,10 +2255,10 @@
       _includedParts = updatedValue(state, _includedParts, Source.EMPTY_ARRAY);
       _includedPartsState = state;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      _bitmask = updatedValue2(state, _bitmask, _CLIENT_CODE_INDEX);
+      _bitmask = updatedValueOfFlag(state, _bitmask, _CLIENT_CODE_INDEX);
       _clientServerState = state;
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      _bitmask = updatedValue2(state, _bitmask, _LAUNCHABLE_INDEX);
+      _bitmask = updatedValueOfFlag(state, _bitmask, _LAUNCHABLE_INDEX);
       _launchableState = state;
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
@@ -2263,7 +2296,7 @@
    *          context for the data
    * @param cacheState the new state of the data represented by the given descriptor
    */
-  void setState2(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
+  void setStateInLibrary(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
     DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
@@ -2298,10 +2331,10 @@
       _includedParts = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
       _includedPartsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      _bitmask = BooleanArray.set2(_bitmask, _CLIENT_CODE_INDEX, value as bool);
+      _bitmask = BooleanArray.set(_bitmask, _CLIENT_CODE_INDEX, value as bool);
       _clientServerState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      _bitmask = BooleanArray.set2(_bitmask, _LAUNCHABLE_INDEX, value as bool);
+      _bitmask = BooleanArray.set(_bitmask, _LAUNCHABLE_INDEX, value as bool);
       _launchableState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       _parseErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
@@ -2336,7 +2369,7 @@
    *          context for the data
    * @param value the new value of the data represented by the given descriptor and library
    */
-  void setValue2(DataDescriptor descriptor, Source librarySource, Object value) {
+  void setValueInLibrary(DataDescriptor descriptor, Source librarySource, Object value) {
     DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
@@ -2385,7 +2418,7 @@
     _angularErrors = other._angularErrors;
   }
 
-  bool 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();
+  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;
 
   void writeOn(JavaStringBuilder builder) {
     builder.append("Dart: ");
@@ -2416,7 +2449,7 @@
     builder.append(_clientServerState);
     builder.append("; launchable = ");
     builder.append(_launchableState);
-    builder.append("; angularElements = ");
+    //    builder.append("; angularElements = ");
     _resolutionState.writeOn(builder);
   }
 
@@ -2473,7 +2506,7 @@
    * @param bitMask the mask used to access the bit whose state is being set
    * @return the value of the data that should be kept in the cache
    */
-  int updatedValue2(CacheState state, int currentValue, int bitIndex) {
+  int updatedValueOfFlag(CacheState state, int currentValue, int bitIndex) {
     if (identical(state, CacheState.VALID)) {
       throw new IllegalArgumentException("Use setValue() to set the state to VALID");
     } else if (identical(state, CacheState.IN_PROCESS)) {
@@ -2482,7 +2515,7 @@
       //
       return currentValue;
     }
-    return BooleanArray.set2(currentValue, bitIndex, false);
+    return BooleanArray.set(currentValue, bitIndex, false);
   }
 }
 
@@ -2582,7 +2615,7 @@
     }
   }
 
-  bool hasErrorState() => identical(_resolvedUnitState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_verificationErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR) || (_nextState != null && _nextState.hasErrorState());
+  bool get hasErrorState => identical(_resolvedUnitState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_verificationErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR) || (_nextState != null && _nextState.hasErrorState);
 
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
@@ -3165,7 +3198,7 @@
     _hintsState = other._hintsState;
   }
 
-  bool hasErrorState() => super.hasErrorState() || identical(_parsedUnitState, CacheState.ERROR) || identical(_resolvedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_referencedLibrariesState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_angularErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR);
+  bool get hasErrorState => super.hasErrorState || identical(_parsedUnitState, CacheState.ERROR) || identical(_resolvedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_referencedLibrariesState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_angularErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR);
 
   void writeOn(JavaStringBuilder builder) {
     builder.append("Html: ");
@@ -3330,7 +3363,7 @@
    * Fix the state of the [exception] to match the current state of the entry.
    */
   void fixExceptionState() {
-    if (hasErrorState()) {
+    if (hasErrorState) {
       if (exception == null) {
         //
         // This code should never be reached, but is a fail-safe in case an exception is not
@@ -3456,7 +3489,7 @@
    *
    * @return `true` if the state of any data value is [CacheState#ERROR]
    */
-  bool hasErrorState() => identical(_contentState, CacheState.ERROR) || identical(_lineInfoState, CacheState.ERROR);
+  bool get hasErrorState => identical(_contentState, CacheState.ERROR) || identical(_lineInfoState, CacheState.ERROR);
 
   /**
    * Given that some data is being transitioned to the given state, return the value that should be
@@ -3518,15 +3551,15 @@
 
   List<Source> get sources => new List.from(_sources);
 
-  void putCacheItem(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
-    putCacheItem3(dartEntry, descriptor, dartEntry.getState2(descriptor, librarySource));
+  void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
+    internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
   }
 
-  void putCacheItem2(SourceEntry dartEntry, DataDescriptor descriptor) {
-    putCacheItem3(dartEntry, descriptor, dartEntry.getState(descriptor));
+  void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
+    internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
   }
 
-  void putCacheItem3(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
+  void internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
     String rowName = rowDesc.toString();
     AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
     if (row == null) {
@@ -3693,7 +3726,7 @@
     //
     // First, compute the list of sources that have been removed.
     //
-    List<Source> removedSources = new List<Source>.from(changeSet.removed3);
+    List<Source> removedSources = new List<Source>.from(changeSet.removedSources);
     for (SourceContainer container in changeSet.removedContainers) {
       addSourcesInContainer(removedSources, container);
     }
@@ -3701,12 +3734,12 @@
     // Then determine which cached results are no longer valid.
     //
     bool addedDartSource = false;
-    for (Source source in changeSet.added3) {
+    for (Source source in changeSet.addedSources) {
       if (sourceAvailable(source)) {
         addedDartSource = true;
       }
     }
-    for (Source source in changeSet.changed3) {
+    for (Source source in changeSet.changedSources) {
       sourceChanged(source);
     }
     for (Source source in removedSources) {
@@ -3860,21 +3893,6 @@
     return null;
   }
 
-  ResolvableHtmlUnit computeResolvableAngularComponentHtmlUnit(Source source) {
-    HtmlEntry htmlEntry = getReadableHtmlEntry(source);
-    if (htmlEntry == null) {
-      throw new AnalysisException.con1("computeResolvableAngularComponentHtmlUnit invoked for non-HTML file: ${source.fullName}");
-    }
-    htmlEntry = cacheHtmlResolutionData(source, htmlEntry, HtmlEntry.RESOLVED_UNIT);
-    ht.HtmlUnit unit = htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT);
-    if (unit == null) {
-      AnalysisException cause = htmlEntry.exception;
-      throw new AnalysisException.con2("Internal error: computeResolvableAngularComponentHtmlUnit could not resolve ${source.fullName}", cause);
-    }
-    // If the unit is ever modified by resolution then we will need to create a copy of it.
-    return new ResolvableHtmlUnit(htmlEntry.modificationTime, unit);
-  }
-
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
     DartEntry dartEntry = getReadableDartEntry(source);
     if (dartEntry == null) {
@@ -3890,20 +3908,6 @@
     return new ResolvableCompilationUnit(dartCopy.modificationTime, unit);
   }
 
-  ResolvableHtmlUnit computeResolvableHtmlUnit(Source source) {
-    HtmlEntry htmlEntry = getReadableHtmlEntry(source);
-    if (htmlEntry == null) {
-      throw new AnalysisException.con1("computeResolvableHtmlUnit invoked for non-HTML file: ${source.fullName}");
-    }
-    htmlEntry = cacheHtmlParseData(source, htmlEntry, HtmlEntry.PARSED_UNIT);
-    ht.HtmlUnit unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT);
-    if (unit == null) {
-      throw new AnalysisException.con1("Internal error: computeResolvableHtmlUnit could not parse ${source.fullName}");
-    }
-    // If the unit is ever modified by resolution then we will need to create a copy of it.
-    return new ResolvableHtmlUnit(htmlEntry.modificationTime, unit);
-  }
-
   bool exists(Source source) {
     if (source == null) {
       return false;
@@ -4141,7 +4145,7 @@
     }
     if (namespace == null) {
       NamespaceBuilder builder = new NamespaceBuilder();
-      namespace = builder.createPublicNamespace(library);
+      namespace = builder.createPublicNamespaceForLibrary(library);
       dartEntry = getReadableDartEntry(source);
       if (dartEntry == null) {
         AnalysisEngine.instance.logger.logError2("Could not compute the public namespace for ${library.source.fullName}", new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}"));
@@ -4170,7 +4174,7 @@
         return null;
       }
       NamespaceBuilder builder = new NamespaceBuilder();
-      namespace = builder.createPublicNamespace(library);
+      namespace = builder.createPublicNamespaceForLibrary(library);
       dartEntry = getReadableDartEntry(source);
       if (dartEntry == null) {
         throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
@@ -4207,7 +4211,7 @@
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
     SourceEntry sourceEntry = getReadableSourceEntry(unitSource);
     if (sourceEntry is DartEntry) {
-      return sourceEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+      return sourceEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
     }
     return null;
   }
@@ -4258,33 +4262,33 @@
         DartEntry dartEntry = entry;
         SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
         // get library independent values
-        statistics.putCacheItem2(dartEntry, SourceEntry.LINE_INFO);
-        statistics.putCacheItem2(dartEntry, DartEntry.PARSE_ERRORS);
-        statistics.putCacheItem2(dartEntry, DartEntry.PARSED_UNIT);
-        statistics.putCacheItem2(dartEntry, DartEntry.SOURCE_KIND);
+        statistics.putCacheItem(dartEntry, SourceEntry.LINE_INFO);
+        statistics.putCacheItem(dartEntry, DartEntry.PARSE_ERRORS);
+        statistics.putCacheItem(dartEntry, DartEntry.PARSED_UNIT);
+        statistics.putCacheItem(dartEntry, DartEntry.SOURCE_KIND);
         if (identical(kind, SourceKind.LIBRARY)) {
-          statistics.putCacheItem2(dartEntry, DartEntry.ELEMENT);
-          statistics.putCacheItem2(dartEntry, DartEntry.EXPORTED_LIBRARIES);
-          statistics.putCacheItem2(dartEntry, DartEntry.IMPORTED_LIBRARIES);
-          statistics.putCacheItem2(dartEntry, DartEntry.INCLUDED_PARTS);
-          statistics.putCacheItem2(dartEntry, DartEntry.IS_CLIENT);
-          statistics.putCacheItem2(dartEntry, DartEntry.IS_LAUNCHABLE);
+          statistics.putCacheItem(dartEntry, DartEntry.ELEMENT);
+          statistics.putCacheItem(dartEntry, DartEntry.EXPORTED_LIBRARIES);
+          statistics.putCacheItem(dartEntry, DartEntry.IMPORTED_LIBRARIES);
+          statistics.putCacheItem(dartEntry, DartEntry.INCLUDED_PARTS);
+          statistics.putCacheItem(dartEntry, DartEntry.IS_CLIENT);
+          statistics.putCacheItem(dartEntry, DartEntry.IS_LAUNCHABLE);
         }
         // get library-specific values
         List<Source> librarySources = getLibrariesContaining(source);
         for (Source librarySource in librarySources) {
-          statistics.putCacheItem(dartEntry, librarySource, DartEntry.HINTS);
-          statistics.putCacheItem(dartEntry, librarySource, DartEntry.RESOLUTION_ERRORS);
-          statistics.putCacheItem(dartEntry, librarySource, DartEntry.RESOLVED_UNIT);
-          statistics.putCacheItem(dartEntry, librarySource, DartEntry.VERIFICATION_ERRORS);
+          statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.HINTS);
+          statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLUTION_ERRORS);
+          statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLVED_UNIT);
+          statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.VERIFICATION_ERRORS);
         }
       } else if (entry is HtmlEntry) {
         HtmlEntry htmlEntry = entry;
-        statistics.putCacheItem2(htmlEntry, SourceEntry.LINE_INFO);
-        statistics.putCacheItem2(htmlEntry, HtmlEntry.PARSE_ERRORS);
-        statistics.putCacheItem2(htmlEntry, HtmlEntry.PARSED_UNIT);
-        statistics.putCacheItem2(htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
-        statistics.putCacheItem2(htmlEntry, HtmlEntry.RESOLVED_UNIT);
+        statistics.putCacheItem(htmlEntry, SourceEntry.LINE_INFO);
+        statistics.putCacheItem(htmlEntry, HtmlEntry.PARSE_ERRORS);
+        statistics.putCacheItem(htmlEntry, HtmlEntry.PARSED_UNIT);
+        statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
+        statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLVED_UNIT);
       }
     }
     return statistics;
@@ -4295,19 +4299,6 @@
     return new TypeProviderImpl(computeLibraryElement(coreSource));
   }
 
-  TimestampedData<CompilationUnit> internalParseCompilationUnit(Source source) {
-    DartEntry dartEntry = getReadableDartEntry(source);
-    if (dartEntry == null) {
-      throw new AnalysisException.con1("internalParseCompilationUnit invoked for non-Dart file: ${source.fullName}");
-    }
-    dartEntry = cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
-    CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-    if (unit == null) {
-      throw new AnalysisException.con2("internalParseCompilationUnit could not cache a parsed unit: ${source.fullName}", dartEntry.exception);
-    }
-    return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, unit);
-  }
-
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement) {
     DartEntry dartEntry = getReadableDartEntry(unitSource);
     if (dartEntry == null) {
@@ -4315,16 +4306,7 @@
     }
     Source librarySource = libraryElement.source;
     dartEntry = cacheDartResolutionData(unitSource, librarySource, dartEntry, DartEntry.RESOLVED_UNIT);
-    return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource));
-  }
-
-  TimestampedData<Token> internalScanTokenStream(Source source) {
-    DartEntry dartEntry = getReadableDartEntry(source);
-    if (dartEntry == null) {
-      throw new AnalysisException.con1("internalScanTokenStream invoked for non-Dart file: ${source.fullName}");
-    }
-    dartEntry = cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
-    return new TimestampedData<Token>(dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM));
+    return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
   }
 
   bool isClientLibrary(Source librarySource) {
@@ -4581,7 +4563,7 @@
           Source librarySource = library.librarySource;
           for (Source source in library.compilationUnitSources) {
             CompilationUnit unit = library.getAST(source);
-            List<AnalysisError> errors = errorListener.getErrors2(source);
+            List<AnalysisError> errors = errorListener.getErrorsForSource(source);
             LineInfo lineInfo = getLineInfo(source);
             DartEntry dartEntry = _cache.get(source) as DartEntry;
             int sourceTime = getModificationStamp(source);
@@ -4597,8 +4579,8 @@
             if (thrownException == null) {
               dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
               dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
-              dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unit);
-              dartCopy.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
+              dartCopy.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
+              dartCopy.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
               if (source == librarySource) {
                 recordElementData(dartEntry, dartCopy, library.libraryElement, librarySource, htmlSource);
               }
@@ -4734,6 +4716,8 @@
    * 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
@@ -4751,7 +4735,8 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      dartEntry = new ResolveDartDependenciesTask(this, source).perform(_resultRecorder) as DartEntry;
+      dartEntry = cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
+      dartEntry = new ResolveDartDependenciesTask(this, source, dartEntry.modificationTime, dartEntry.anyParsedCompilationUnit).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getState(descriptor);
     }
     return dartEntry;
@@ -4774,14 +4759,14 @@
     //
     // Check to see whether we already have the information being requested.
     //
-    CacheState state = dartEntry.getState2(descriptor, librarySource);
+    CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
     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 = new GenerateDartHintsTask(this, getLibraryElement(librarySource)).perform(_resultRecorder) as DartEntry;
-      state = dartEntry.getState2(descriptor, librarySource);
+      state = dartEntry.getStateInLibrary(descriptor, librarySource);
     }
     return dartEntry;
   }
@@ -4791,6 +4776,8 @@
    * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This
    * method assumes that the data can be produced by parsing the source if it is 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
@@ -4813,7 +4800,8 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      dartEntry = new ParseDartTask(this, source).perform(_resultRecorder) as DartEntry;
+      dartEntry = cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
+      dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM)).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getState(descriptor);
     }
     return dartEntry;
@@ -4836,7 +4824,7 @@
     //
     // Check to see whether we already have the information being requested.
     //
-    CacheState state = (identical(descriptor, DartEntry.ELEMENT)) ? dartEntry.getState(descriptor) : dartEntry.getState2(descriptor, librarySource);
+    CacheState state = (identical(descriptor, DartEntry.ELEMENT)) ? dartEntry.getState(descriptor) : dartEntry.getStateInLibrary(descriptor, librarySource);
     while (state != CacheState.ERROR && state != CacheState.VALID) {
       //
       // If not, compute the information. Unless the modification date of the source continues to
@@ -4845,7 +4833,7 @@
       // TODO(brianwilkerson) As an optimization, if we already have the element model for the
       // library we can use ResolveDartUnitTask to produce the resolved AST structure much faster.
       dartEntry = new ResolveDartLibraryTask(this, unitSource, librarySource).perform(_resultRecorder) as DartEntry;
-      state = (identical(descriptor, DartEntry.ELEMENT)) ? dartEntry.getState(descriptor) : dartEntry.getState2(descriptor, librarySource);
+      state = (identical(descriptor, DartEntry.ELEMENT)) ? dartEntry.getState(descriptor) : dartEntry.getStateInLibrary(descriptor, librarySource);
     }
     return dartEntry;
   }
@@ -4856,6 +4844,8 @@
    * method assumes that the data can be produced by scanning the source if it is 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
@@ -4872,10 +4862,11 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      // TODO(brianwilkerson) Convert this to get the contents from the cache. (I'm not sure how
-      // that would work in an asynchronous environment.)
       try {
-        dartEntry = new ScanDartTask(this, source, getContents(source)).perform(_resultRecorder) as DartEntry;
+        if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+          dartEntry = new GetContentTask(this, source).perform(_resultRecorder) as DartEntry;
+        }
+        dartEntry = new ScanDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as DartEntry;
       } on AnalysisException catch (exception) {
         throw exception;
       } on JavaException catch (exception) {
@@ -4903,14 +4894,14 @@
     //
     // Check to see whether we already have the information being requested.
     //
-    CacheState state = dartEntry.getState2(descriptor, librarySource);
+    CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
     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 = new GenerateDartErrorsTask(this, unitSource, getLibraryElement(librarySource)).perform(_resultRecorder) as DartEntry;
-      state = dartEntry.getState2(descriptor, librarySource);
+      state = dartEntry.getStateInLibrary(descriptor, librarySource);
     }
     return dartEntry;
   }
@@ -4921,6 +4912,8 @@
    * [CacheState#ERROR]. This method assumes that the data can be produced by parsing the
    * source if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @param source the source representing the HTML file
    * @param htmlEntry the cache entry associated with the HTML file
    * @param descriptor the descriptor representing the data to be returned
@@ -4944,10 +4937,11 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      // TODO(brianwilkerson) Convert this to get the contents from the cache. (I'm not sure how
-      // that would work in an asynchronous environment.)
       try {
-        htmlEntry = new ParseHtmlTask(this, source, getContents(source)).perform(_resultRecorder) as HtmlEntry;
+        if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+          htmlEntry = new GetContentTask(this, source).perform(_resultRecorder) as HtmlEntry;
+        }
+        htmlEntry = new ParseHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as HtmlEntry;
       } on AnalysisException catch (exception) {
         throw exception;
       } on JavaException catch (exception) {
@@ -4964,6 +4958,8 @@
    * [CacheState#ERROR]. This method assumes that the data can be produced by resolving the
    * source if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @param source the source representing the HTML file
    * @param dartEntry the cache entry associated with the HTML file
    * @param descriptor the descriptor representing the data to be returned
@@ -4981,7 +4977,8 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      htmlEntry = new ResolveHtmlTask(this, source).perform(_resultRecorder) as HtmlEntry;
+      htmlEntry = cacheHtmlParseData(source, htmlEntry, HtmlEntry.PARSED_UNIT);
+      htmlEntry = new ResolveHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(HtmlEntry.PARSED_UNIT)).perform(_resultRecorder) as HtmlEntry;
       state = htmlEntry.getState(descriptor);
     }
     return htmlEntry;
@@ -5028,6 +5025,117 @@
   }
 
   /**
+   * Create a [GetContentTask] for the given source, marking the content as being in-process.
+   *
+   * @param source the source whose content is to be accessed
+   * @param sourceEntry the entry for the source
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData createGetContentTask(Source source, SourceEntry sourceEntry) {
+    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);
+  }
+
+  /**
+   * Create a [ParseDartTask] for the given source, marking the parse errors as being
+   * in-process.
+   *
+   * @param source the source whose content is to be parsed
+   * @param dartEntry the entry for the source
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData createParseDartTask(Source source, DartEntry dartEntry) {
+    if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID) {
+      return createScanDartTask(source, dartEntry);
+    }
+    Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
+    DartEntryImpl dartCopy = dartEntry.writableCopy;
+    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);
+  }
+
+  /**
+   * Create a [ParseHtmlTask] for the given source, marking the parse errors as being
+   * in-process.
+   *
+   * @param source the source whose content is to be parsed
+   * @param htmlEntry the entry for the source
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData createParseHtmlTask(Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+      return createGetContentTask(source, htmlEntry);
+    }
+    String content = htmlEntry.getValue(SourceEntry.CONTENT);
+    HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+    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);
+  }
+
+  /**
+   * Create a [ResolveDartDependenciesTask] for the given source, marking the exported
+   * libraries as being in-process.
+   *
+   * @param source the source whose content is to be used to resolve dependencies
+   * @param dartEntry 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);
+    }
+    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);
+  }
+
+  /**
+   * Create a [ResolveHtmlTask] for the given source, marking the resolved unit 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 createResolveHtmlTask(Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) {
+      return createParseHtmlTask(source, htmlEntry);
+    }
+    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);
+  }
+
+  /**
+   * Create a [ScanDartTask] for the given source, marking the scan errors as being
+   * in-process.
+   *
+   * @param source the source whose content is to be scanned
+   * @param dartEntry the entry for the source
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData createScanDartTask(Source source, DartEntry dartEntry) {
+    if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+      return createGetContentTask(source, dartEntry);
+    }
+    String content = dartEntry.getValue(SourceEntry.CONTENT);
+    DartEntryImpl dartCopy = dartEntry.writableCopy;
+    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);
+  }
+
+  /**
    * Create a source information object suitable for the given source. Return the source information
    * object that was created, or `null` if the source should not be tracked by this context.
    *
@@ -5137,7 +5245,7 @@
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return dartEntry.getValue(descriptor);
     }
-    return dartEntry.getValue2(descriptor, librarySource);
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
   }
 
   /**
@@ -5145,6 +5253,8 @@
    * associated with that source. This method assumes that the data can be produced by parsing the
    * source if it is 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
@@ -5165,6 +5275,8 @@
    * 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 parsing the source if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @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
@@ -5204,7 +5316,7 @@
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
       accessedAst(unitSource);
     }
-    return dartEntry.getValue2(descriptor, librarySource);
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
   }
 
   /**
@@ -5239,6 +5351,8 @@
    * associated with that source. This method assumes that the data can be produced by scanning the
    * source if it is 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
@@ -5256,6 +5370,8 @@
    * method assumes that the data can be produced by scanning the source if it is not already
    * cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @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
@@ -5290,7 +5406,7 @@
    */
   Object getDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
     dartEntry = cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor);
-    return dartEntry.getValue2(descriptor, librarySource);
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
   }
 
   /**
@@ -5298,6 +5414,8 @@
    * associated with that source, or the given default value if the source is not an HTML file. This
    * method assumes that the data can be produced by parsing the source if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @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 an HTML file
@@ -5323,6 +5441,8 @@
    * method assumes that the data can be produced by resolving the source if it is not already
    * cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @param source the source representing the HTML file
    * @param descriptor the descriptor representing the data to be returned
    * @param defaultValue the value to be returned if the source is not an HTML file
@@ -5348,6 +5468,8 @@
    * associated with that source. This method assumes that the data can be produced by resolving the
    * source if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @param source the source representing the HTML file
    * @param htmlEntry the entry representing the HTML file
    * @param descriptor the descriptor representing the data to be returned
@@ -5376,7 +5498,7 @@
     //
     // Look for incremental analysis
     //
-    if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork()) {
+    if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork) {
       AnalysisTask task = new IncrementalAnalysisTask(this, _incrementalAnalysisCache);
       _incrementalAnalysisCache = null;
       return task;
@@ -5448,62 +5570,31 @@
     }
     CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
     if (identical(contentState, CacheState.INVALID)) {
-      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 createGetContentTask(source, sourceEntry);
     } else if (identical(contentState, CacheState.IN_PROCESS)) {
-      // We are in the process of getting the content. There's nothing else we can do with this
-      // source until that's complete.
+      // 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);
     }
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
       if (identical(scanErrorsState, CacheState.INVALID) || (isPriority && identical(scanErrorsState, CacheState.FLUSHED))) {
-        // TODO(brianwilkerson) Convert this to get the contents from the cache or to asynchronously
-        // request the contents if they are not in the cache.
-        try {
-          DartEntryImpl dartCopy = dartEntry.writableCopy;
-          dartCopy.setState(DartEntry.SCAN_ERRORS, CacheState.IN_PROCESS);
-          TimestampedData<String> contentData;
-          if (identical(contentState, CacheState.VALID)) {
-            contentData = new TimestampedData<String>(dartCopy.modificationTime, dartCopy.getValue(SourceEntry.CONTENT));
-            dartCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
-          } else {
-            contentData = getContents(source);
-          }
-          _cache.put(source, dartCopy);
-          return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, contentData), false, null);
-        } on JavaException catch (exception) {
-          DartEntryImpl dartCopy = dartEntry.writableCopy;
-          dartCopy.recordScanError();
-          dartCopy.exception = new AnalysisException.con3(exception);
-          _cache.put(source, dartCopy);
-        }
+        return createScanDartTask(source, dartEntry);
       }
       CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
       if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
-        DartEntryImpl dartCopy = dartEntry.writableCopy;
-        dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
-        _cache.put(source, dartCopy);
-        return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source), false, null);
+        return createParseDartTask(source, dartEntry);
       }
       if (isPriority && parseErrorsState != CacheState.ERROR) {
         CompilationUnit parseUnit = dartEntry.anyParsedCompilationUnit;
         if (parseUnit == null) {
-          DartEntryImpl dartCopy = dartEntry.writableCopy;
-          dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.IN_PROCESS);
-          _cache.put(source, dartCopy);
-          return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source), false, null);
+          return createParseDartTask(source, dartEntry);
         }
       }
       CacheState exportState = dartEntry.getState(DartEntry.EXPORTED_LIBRARIES);
       if (identical(exportState, CacheState.INVALID) || (isPriority && identical(exportState, CacheState.FLUSHED))) {
-        DartEntryImpl dartCopy = dartEntry.writableCopy;
-        dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.IN_PROCESS);
-        _cache.put(source, dartCopy);
-        return new AnalysisContextImpl_TaskData(new ResolveDartDependenciesTask(this, source), false, null);
+        return createResolveDartDependenciesTask(source, dartEntry);
       }
       List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
       for (Source librarySource in librariesContaining) {
@@ -5516,7 +5607,7 @@
             _cache.put(librarySource, libraryCopy);
             return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
           }
-          CacheState resolvedUnitState = dartEntry.getState2(DartEntry.RESOLVED_UNIT, librarySource);
+          CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
           if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
             //
             // The commented out lines below are an optimization that doesn't quite work yet. The
@@ -5526,29 +5617,29 @@
             //LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
             //if (libraryElement != null) {
             DartEntryImpl dartCopy = dartEntry.writableCopy;
-            dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.IN_PROCESS);
+            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);
           }
           if (sdkErrorsEnabled || !source.isInSystemLibrary) {
-            CacheState verificationErrorsState = dartEntry.getState2(DartEntry.VERIFICATION_ERRORS, librarySource);
+            CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
             if (identical(verificationErrorsState, CacheState.INVALID) || (isPriority && identical(verificationErrorsState, CacheState.FLUSHED))) {
               LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
               if (libraryElement != null) {
                 DartEntryImpl dartCopy = dartEntry.writableCopy;
-                dartCopy.setState2(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS);
+                dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS);
                 _cache.put(source, dartCopy);
                 return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false, null);
               }
             }
             if (hintsEnabled) {
-              CacheState hintsState = dartEntry.getState2(DartEntry.HINTS, librarySource);
+              CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
               if (identical(hintsState, CacheState.INVALID) || (isPriority && identical(hintsState, CacheState.FLUSHED))) {
                 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
                 if (libraryElement != null) {
                   DartEntryImpl dartCopy = dartEntry.writableCopy;
-                  dartCopy.setState2(DartEntry.HINTS, librarySource, CacheState.IN_PROCESS);
+                  dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.IN_PROCESS);
                   _cache.put(source, dartCopy);
                   return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false, null);
                 }
@@ -5561,75 +5652,44 @@
       HtmlEntry htmlEntry = sourceEntry;
       CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS);
       if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
-        try {
-          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-          htmlCopy.setState(HtmlEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
-          TimestampedData<String> contentData;
-          if (identical(contentState, CacheState.VALID)) {
-            contentData = new TimestampedData<String>(htmlCopy.modificationTime, htmlCopy.getValue(SourceEntry.CONTENT));
-            htmlCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
-          } else {
-            contentData = getContents(source);
-          }
-          _cache.put(source, htmlCopy);
-          return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, contentData), false, null);
-        } on JavaException catch (exception) {
-          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-          htmlCopy.recordParseError();
-          htmlCopy.exception = new AnalysisException.con3(exception);
-          _cache.put(source, htmlCopy);
-        }
+        return createParseHtmlTask(source, htmlEntry);
       }
       if (isPriority && parseErrorsState != CacheState.ERROR) {
         ht.HtmlUnit parsedUnit = htmlEntry.anyParsedUnit;
         if (parsedUnit == null) {
-          try {
-            HtmlEntryImpl dartCopy = htmlEntry.writableCopy;
-            dartCopy.setState(HtmlEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
-            TimestampedData<String> contentData;
-            if (identical(contentState, CacheState.VALID)) {
-              contentData = new TimestampedData<String>(dartCopy.modificationTime, dartCopy.getValue(SourceEntry.CONTENT));
-              dartCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
-            } else {
-              contentData = getContents(source);
-            }
-            _cache.put(source, dartCopy);
-            return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, contentData), false, null);
-          } on JavaException catch (exception) {
-            HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-            htmlCopy.recordParseError();
-            htmlCopy.exception = new AnalysisException.con3(exception);
-            _cache.put(source, htmlCopy);
-          }
+          return createParseHtmlTask(source, htmlEntry);
         }
       }
       CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
       if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
-        HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-        htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.IN_PROCESS);
-        _cache.put(source, htmlCopy);
-        return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source), false, null);
+        return createResolveHtmlTask(source, htmlEntry);
       }
       // Angular support
       if (_options.analyzeAngular) {
         // try to resolve 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), false, null);
+          return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false, null);
         }
         // try to resolve 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, component, application), false, null);
+          return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false, null);
         }
       }
     }
@@ -5775,7 +5835,7 @@
             sources.add(source);
             return;
           }
-          CacheState resolvedUnitState = dartEntry.getState2(DartEntry.RESOLVED_UNIT, librarySource);
+          CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
           if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
             LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
             if (libraryElement != null) {
@@ -5783,7 +5843,7 @@
               return;
             }
           }
-          CacheState verificationErrorsState = dartEntry.getState2(DartEntry.VERIFICATION_ERRORS, librarySource);
+          CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
           if (identical(verificationErrorsState, CacheState.INVALID) || (isPriority && identical(verificationErrorsState, CacheState.FLUSHED))) {
             LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
             if (libraryElement != null) {
@@ -5792,7 +5852,7 @@
             }
           }
           if (hintsEnabled) {
-            CacheState hintsState = dartEntry.getState2(DartEntry.HINTS, librarySource);
+            CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
             if (identical(hintsState, CacheState.INVALID) || (isPriority && identical(hintsState, CacheState.FLUSHED))) {
               LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
               if (libraryElement != null) {
@@ -6136,11 +6196,11 @@
       }
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
-        dartCopy.setValue2(DartEntry.VERIFICATION_ERRORS, librarySource, task.errors);
+        dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, task.errors);
         ChangeNoticeImpl notice = getNotice(source);
         notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
       } else {
-        dartCopy.setState2(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
+        dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
       }
       dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
@@ -6165,7 +6225,7 @@
         // cache so that we won't attempt to re-verify the source until there's a good chance
         // that we'll be able to do so without error.
         //
-        dartCopy.setState2(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
+        dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
       }
       dartCopy.exception = thrownException;
       _cache.put(source, dartCopy);
@@ -6205,7 +6265,7 @@
         thrownException = new AnalysisException.con1("GenerateDartHintsTask returned a null hint map without throwing an exception: ${librarySource.fullName}");
       }
       DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
-      dartCopy.setState2(DartEntry.HINTS, librarySource, CacheState.ERROR);
+      dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
       dartCopy.exception = thrownException;
       _cache.put(librarySource, dartCopy);
       throw thrownException;
@@ -6236,18 +6296,18 @@
         }
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null) {
-          dartCopy.setValue2(DartEntry.HINTS, librarySource, results.data);
+          dartCopy.setValueInLibrary(DartEntry.HINTS, librarySource, results.data);
           ChangeNoticeImpl notice = getNotice(unitSource);
           notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
         } else {
-          dartCopy.setState2(DartEntry.HINTS, librarySource, CacheState.ERROR);
+          dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
         }
         dartCopy.exception = thrownException;
         _cache.put(unitSource, dartCopy);
         dartEntry = dartCopy;
       } else {
         logInformation2("Generated hints discarded for ${debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
-        if (identical(dartEntry.getState2(DartEntry.HINTS, librarySource), CacheState.IN_PROCESS)) {
+        if (identical(dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource), CacheState.IN_PROCESS)) {
           DartEntryImpl dartCopy = dartEntry.writableCopy;
           if (thrownException == null || resultTime >= 0) {
             //
@@ -6266,7 +6326,7 @@
             // 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.setState2(DartEntry.HINTS, librarySource, CacheState.ERROR);
+            dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
           }
           dartCopy.exception = thrownException;
           _cache.put(unitSource, dartCopy);
@@ -6366,7 +6426,7 @@
       }
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
-        if (task.hasPartOfDirective() && !task.hasLibraryDirective()) {
+        if (task.hasPartOfDirective && !task.hasLibraryDirective) {
           dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
           dartCopy.removeContainingLibrary(source);
           _workManager.add(source, SourcePriority.NORMAL_PART);
@@ -6800,10 +6860,10 @@
       }
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
-        dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource, task.resolvedUnit);
+        dartCopy.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, task.resolvedUnit);
         _cache.storedAst(unitSource);
       } else {
-        dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
+        dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
         _cache.removedAst(unitSource);
       }
       dartCopy.exception = thrownException;
@@ -6831,7 +6891,7 @@
         // 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.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
+        dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.ERROR);
       }
       dartCopy.exception = thrownException;
       _cache.put(unitSource, dartCopy);
@@ -7849,7 +7909,7 @@
       if (librarySources.length == 1) {
         librarySource = librarySources[0];
         if (librarySource != null) {
-          unit = dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+          unit = dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
         }
       }
     }
@@ -7894,7 +7954,7 @@
    */
   static IncrementalAnalysisCache verifyStructure(IncrementalAnalysisCache cache, Source source, CompilationUnit unit) {
     if (cache != null && unit != null && cache.source == source) {
-      if (!AstComparator.equals4(cache.resolvedUnit, unit)) {
+      if (!AstComparator.equalUnits(cache.resolvedUnit, unit)) {
         return null;
       }
     }
@@ -7957,7 +8017,7 @@
    *
    * @return `true` if the cache contains changes to be analyzed, else `false`
    */
-  bool hasWork() => _oldLength > 0 || _newLength > 0;
+  bool get hasWork => _oldLength > 0 || _newLength > 0;
 }
 
 /**
@@ -8091,12 +8151,8 @@
     }
   }
 
-  ResolvableHtmlUnit computeResolvableAngularComponentHtmlUnit(Source source) => _basis.computeResolvableAngularComponentHtmlUnit(source);
-
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) => _basis.computeResolvableCompilationUnit(source);
 
-  ResolvableHtmlUnit computeResolvableHtmlUnit(Source source) => _basis.computeResolvableHtmlUnit(source);
-
   bool exists(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-exists");
     try {
@@ -8382,12 +8438,8 @@
 
   TypeProvider get typeProvider => _basis.typeProvider;
 
-  TimestampedData<CompilationUnit> internalParseCompilationUnit(Source source) => _basis.internalParseCompilationUnit(source);
-
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement) => _basis.internalResolveCompilationUnit(unitSource, libraryElement);
 
-  TimestampedData<Token> internalScanTokenStream(Source source) => _basis.internalScanTokenStream(source);
-
   bool isClientLibrary(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isClientLibrary");
     try {
@@ -8592,19 +8644,11 @@
 
   /**
    * Return an AST structure corresponding to the given source, but ensure that the structure has
-   * not already been resolved and will not be resolved by any other threads.
-   *
-   * @param source the compilation unit for which an AST structure should be returned
-   * @return the AST structure representing the content of the source
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  ResolvableHtmlUnit computeResolvableAngularComponentHtmlUnit(Source source);
-
-  /**
-   * Return an AST structure corresponding to the given source, but ensure that the structure has
    * not already been resolved and will not be resolved by any other threads or in any other
    * library.
    *
+   * <b>Note:</b> This method cannot be used in an async environment
+   *
    * @param source the compilation unit for which an AST structure should be returned
    * @return the AST structure representing the content of the source
    * @throws AnalysisException if the analysis could not be performed
@@ -8612,16 +8656,6 @@
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source);
 
   /**
-   * Return an AST structure corresponding to the given source, but ensure that the structure has
-   * not already been resolved and will not be resolved by any other threads.
-   *
-   * @param source the compilation unit for which an AST structure should be returned
-   * @return the AST structure representing the content of the source
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  ResolvableHtmlUnit computeResolvableHtmlUnit(Source source);
-
-  /**
    * Initialize the specified context by removing the specified sources from the receiver and adding
    * them to the specified context.
    *
@@ -8666,15 +8700,6 @@
   TypeProvider get typeProvider;
 
   /**
-   * Return a time-stamped parsed AST for the given source.
-   *
-   * @param source the source of the compilation unit for which an AST is to be returned
-   * @return a time-stamped AST for the source
-   * @throws AnalysisException if the source could not be parsed
-   */
-  TimestampedData<CompilationUnit> internalParseCompilationUnit(Source source);
-
-  /**
    * Return a time-stamped fully-resolved compilation unit for the given source in the given
    * library.
    *
@@ -8688,15 +8713,6 @@
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement);
 
   /**
-   * Return a time-stamped token stream for the given source.
-   *
-   * @param source the source of the compilation unit for which a token stream is to be returned
-   * @return a time-stamped token stream for the source
-   * @throws AnalysisException if the token stream could not be computed
-   */
-  TimestampedData<Token> internalScanTokenStream(Source source);
-
-  /**
    * Given a table mapping the source for the libraries represented by the corresponding elements to
    * the elements representing the libraries, record those mappings.
    *
@@ -8793,7 +8809,7 @@
    *          collected by this listener
    * @return the errors collected by the listener for the passed [Source]
    */
-  List<AnalysisError> getErrors2(Source source) {
+  List<AnalysisError> getErrorsForSource(Source source) {
     Set<AnalysisError> errorsForSource = _errors[source];
     if (errorsForSource == null) {
       return AnalysisError.NO_ERRORS;
@@ -9454,7 +9470,7 @@
       // process node in separate name scope
       pushNameScope();
       try {
-        parseEmbeddedExpressions2(node);
+        parseEmbeddedExpressionsInTag(node);
         // apply processors
         for (NgProcessor processor in _processors) {
           if (processor.canApply(node)) {
@@ -9480,7 +9496,7 @@
    * @param identifier the identifier to create variable for
    * @return the new [LocalVariableElementImpl]
    */
-  LocalVariableElementImpl createLocalVariable(Type2 type, SimpleIdentifier identifier) {
+  LocalVariableElementImpl createLocalVariableFromIdentifier(Type2 type, SimpleIdentifier identifier) {
     LocalVariableElementImpl variable = new LocalVariableElementImpl(identifier);
     _definedVariables.add(variable);
     variable.type = type;
@@ -9494,9 +9510,9 @@
    * @param name the name of the variable
    * @return the new [LocalVariableElementImpl]
    */
-  LocalVariableElementImpl createLocalVariable2(Type2 type, String name) {
+  LocalVariableElementImpl createLocalVariableWithName(Type2 type, String name) {
     SimpleIdentifier identifier = createIdentifier(name, 0);
-    return createLocalVariable(type, identifier);
+    return createLocalVariableFromIdentifier(type, identifier);
   }
 
   /**
@@ -9537,16 +9553,14 @@
   /**
    * Parses given [String] as an [AngularExpression] at the given offset.
    */
-  AngularExpression parseAngularExpression(String contents, int offset) => parseAngularExpression2(contents, 0, contents.length, offset);
-
-  AngularExpression parseAngularExpression2(String contents, int startIndex, int endIndex, int offset) {
+  AngularExpression parseAngularExpression(String contents, int startIndex, int endIndex, int offset) {
     Token token = scanDart(contents, startIndex, endIndex, offset);
-    return parseAngularExpression3(token);
+    return parseAngularExpressionInToken(token);
   }
 
-  AngularExpression parseAngularExpression3(Token token) {
+  AngularExpression parseAngularExpressionInToken(Token token) {
     List<Token> tokens = splitAtBar(token);
-    Expression mainExpression = parseDartExpression3(tokens[0]);
+    Expression mainExpression = parseDartExpressionInToken(tokens[0]);
     // parse filters
     List<AngularFilterNode> filters = [];
     for (int i = 1; i < tokens.length; i++) {
@@ -9554,7 +9568,7 @@
       Token barToken = filterToken;
       filterToken = filterToken.next;
       // TODO(scheglov) report missing identifier
-      SimpleIdentifier name = parseDartExpression3(filterToken) as SimpleIdentifier;
+      SimpleIdentifier name = parseDartExpressionInToken(filterToken) as SimpleIdentifier;
       filterToken = name.endToken.next;
       // parse arguments
       List<AngularFilterArgument> arguments = [];
@@ -9567,7 +9581,7 @@
           reportErrorForToken(AngularCode.MISSING_FILTER_COLON, colonToken, []);
         }
         // parse argument
-        Expression argument = parseDartExpression3(filterToken);
+        Expression argument = parseDartExpressionInToken(filterToken);
         arguments.add(new AngularFilterArgument(colonToken, argument));
         // next token
         filterToken = argument.endToken.next;
@@ -9581,14 +9595,12 @@
   /**
    * Parses given [String] as an [Expression] at the given offset.
    */
-  Expression parseDartExpression(String contents, int offset) => parseDartExpression2(contents, 0, contents.length, offset);
-
-  Expression parseDartExpression2(String contents, int startIndex, int endIndex, int offset) {
+  Expression parseDartExpression(String contents, int startIndex, int endIndex, int offset) {
     Token token = scanDart(contents, startIndex, endIndex, offset);
-    return parseDartExpression3(token);
+    return parseDartExpressionInToken(token);
   }
 
-  Expression parseDartExpression3(Token token) {
+  Expression parseDartExpressionInToken(Token token) {
     Parser parser = new Parser(_source, _errorListener);
     return parser.parseExpression(token);
   }
@@ -9688,9 +9700,9 @@
     // add Scope variables - no type, no location, just to avoid warnings
     {
       Type2 type = _typeProvider.dynamicType;
-      _topNameScope.define(createLocalVariable2(type, "\$id"));
-      _topNameScope.define(createLocalVariable2(type, "\$parent"));
-      _topNameScope.define(createLocalVariable2(type, "\$root"));
+      _topNameScope.define(createLocalVariableWithName(type, "\$id"));
+      _topNameScope.define(createLocalVariableWithName(type, "\$parent"));
+      _topNameScope.define(createLocalVariableWithName(type, "\$root"));
     }
   }
 
@@ -9701,7 +9713,7 @@
   void defineTopVariable_forClassElement(AngularElement element) {
     ClassElement classElement = element.enclosingElement as ClassElement;
     InterfaceType type = classElement.type;
-    LocalVariableElementImpl variable = createLocalVariable2(type, element.name);
+    LocalVariableElementImpl variable = createLocalVariableWithName(type, element.name);
     defineTopVariable(variable);
     variable.toolkitObjects = <AngularElement> [element];
   }
@@ -9711,7 +9723,7 @@
    */
   void defineTopVariable_forScopeProperty(AngularScopePropertyElement element) {
     Type2 type = element.type;
-    LocalVariableElementImpl variable = createLocalVariable2(type, element.name);
+    LocalVariableElementImpl variable = createLocalVariableWithName(type, element.name);
     defineTopVariable(variable);
     variable.toolkitObjects = <AngularElement> [element];
   }
@@ -9736,14 +9748,22 @@
         return;
       } else if (startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH < endIndex) {
         startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH;
-        AngularExpression expression = parseAngularExpression2(lexeme, startIndex, endIndex, offset);
+        AngularExpression expression = parseAngularExpression(lexeme, startIndex, endIndex, offset);
         expressions.add(new AngularMoustacheXmlExpression(startIndex, endIndex, expression));
       }
       startIndex = StringUtilities.indexOf2(lexeme, endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
     }
   }
 
-  void parseEmbeddedExpressions2(ht.XmlTagNode node) {
+  void parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
+    List<AngularMoustacheXmlExpression> expressions = [];
+    parseEmbeddedExpressions(expressions, node.valueToken);
+    if (!expressions.isEmpty) {
+      node.expressions = new List.from(expressions);
+    }
+  }
+
+  void parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
     List<AngularMoustacheXmlExpression> expressions = [];
     ht.Token token = node.attributeEnd;
     ht.Token endToken = node.endToken;
@@ -9767,14 +9787,6 @@
     node.expressions = new List.from(expressions);
   }
 
-  void parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
-    List<AngularMoustacheXmlExpression> expressions = [];
-    parseEmbeddedExpressions(expressions, node.valueToken);
-    if (!expressions.isEmpty) {
-      node.expressions = new List.from(expressions);
-    }
-  }
-
   void recordDefinedVariable(LocalVariableElementImpl variable) {
     _definedVariables.add(variable);
     _functionElement.localVariables = new List.from(_definedVariables);
@@ -9788,16 +9800,11 @@
     _injectedLibraries.add(typeLibrary);
   }
 
-  void resolveExpression2(AngularXmlExpression angularXmlExpression) {
-    AngularExpression angularExpression = angularXmlExpression.expression;
-    resolveExpression(angularExpression);
-  }
-
   void resolveExpressions(List<ht.XmlExpression> expressions) {
     for (ht.XmlExpression xmlExpression in expressions) {
       if (xmlExpression is AngularXmlExpression) {
         AngularXmlExpression angularXmlExpression = xmlExpression;
-        resolveExpression2(angularXmlExpression);
+        resolveXmlExpression(angularXmlExpression);
       }
     }
   }
@@ -9862,6 +9869,11 @@
     }
   }
 
+  void resolveXmlExpression(AngularXmlExpression angularXmlExpression) {
+    AngularExpression angularExpression = angularXmlExpression.expression;
+    resolveExpression(angularExpression);
+  }
+
   List<Token> splitAtBar(Token token) {
     List<Token> tokens = [];
     tokens.add(token);
@@ -10093,7 +10105,7 @@
         if (property.propertyKind != AngularPropertyKind.ATTR) {
           AngularExpression expression = parseAngularExpression(resolver, attribute);
           resolver.resolveExpression(expression);
-          setExpression(attribute, expression);
+          setAngularExpression(attribute, expression);
         }
       }
     }
@@ -10115,7 +10127,7 @@
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
     InterfaceType type = (_element.enclosingElement as ClassElement).type;
     String name = _element.name;
-    LocalVariableElementImpl variable = resolver.createLocalVariable2(type, name);
+    LocalVariableElementImpl variable = resolver.createLocalVariableWithName(type, name);
     resolver.defineVariable(variable);
     variable.toolkitObjects = <AngularElement> [_element];
   }
@@ -10168,7 +10180,7 @@
             onNgEventDirective(resolver);
             AngularExpression expression = parseAngularExpression(resolver, attribute);
             resolver.resolveExpression(expression);
-            setExpression(attribute, expression);
+            setAngularExpression(attribute, expression);
           } finally {
             resolver.popNameScope();
           }
@@ -10185,7 +10197,7 @@
   void onNgEventDirective(AngularHtmlUnitResolver resolver) {
     if (_element.isClass("NgEventDirective")) {
       Type2 dynamicType = resolver.typeProvider.dynamicType;
-      resolver.defineVariable(resolver.createLocalVariable2(dynamicType, "\$event"));
+      resolver.defineVariable(resolver.createLocalVariableWithName(dynamicType, "\$event"));
     }
   }
 }
@@ -10200,26 +10212,26 @@
 
   AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) {
     Token token = scanAttribute(resolver, attribute);
-    return resolver.parseAngularExpression3(token);
+    return resolver.parseAngularExpressionInToken(token);
   }
 
   Expression parseDartExpression(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) {
     Token token = scanAttribute(resolver, attribute);
-    return resolver.parseDartExpression3(token);
+    return resolver.parseDartExpressionInToken(token);
   }
 
   /**
    * Sets single [AngularExpression] for [XmlAttributeNode].
    */
-  void setExpression(ht.XmlAttributeNode attribute, AngularExpression expression) {
-    setExpression3(attribute, newAngularRawXmlExpression(expression));
+  void setAngularExpression(ht.XmlAttributeNode attribute, AngularExpression expression) {
+    setExpression2(attribute, newAngularRawXmlExpression(expression));
   }
 
   /**
    * Sets single [Expression] for [XmlAttributeNode].
    */
-  void setExpression2(ht.XmlAttributeNode attribute, Expression expression) {
-    setExpression3(attribute, newRawXmlExpression(expression));
+  void setExpression(ht.XmlAttributeNode attribute, Expression expression) {
+    setExpression2(attribute, newRawXmlExpression(expression));
   }
 
   void setExpressions(ht.XmlAttributeNode attribute, List<ht.XmlExpression> xmlExpressions) {
@@ -10232,7 +10244,7 @@
     return resolver.scanDart(value, 0, value.length, offset);
   }
 
-  void setExpression3(ht.XmlAttributeNode attribute, ht.XmlExpression xmlExpression) {
+  void setExpression2(ht.XmlAttributeNode attribute, ht.XmlExpression xmlExpression) {
     attribute.expressions = <ht.XmlExpression> [xmlExpression];
   }
 }
@@ -10255,7 +10267,7 @@
     // resolve
     resolver.resolveNode(expression);
     // remember expression
-    setExpression2(attribute, expression);
+    setExpression(attribute, expression);
   }
 
   bool canApply(ht.XmlTagNode node) => node.getAttribute(_NG_MODEL) != null;
@@ -10274,12 +10286,12 @@
     SimpleIdentifier identifier = expression as SimpleIdentifier;
     // define variable Element
     InterfaceType type = resolver.typeProvider.stringType;
-    LocalVariableElementImpl element = resolver.createLocalVariable(type, identifier);
+    LocalVariableElementImpl element = resolver.createLocalVariableFromIdentifier(type, identifier);
     resolver.defineTopVariable(element);
     // remember expression
     identifier.staticElement = element;
     identifier.staticType = type;
-    setExpression2(attribute, identifier);
+    setExpression(attribute, identifier);
   }
 }
 
@@ -10592,7 +10604,7 @@
       //
       ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider, new InheritanceManager(libraryElement));
       unit.accept(errorVerifier);
-      _errors = errorListener.getErrors2(source);
+      _errors = errorListener.getErrorsForSource(source);
     } finally {
       timeCounter.stop();
     }
@@ -10681,7 +10693,7 @@
     for (MapEntry<Source, TimestampedData<CompilationUnit>> entry in getMapEntrySet(timestampMap)) {
       Source source = entry.getKey();
       TimestampedData<CompilationUnit> unitData = entry.getValue();
-      List<AnalysisError> errors = errorListener.getErrors2(source);
+      List<AnalysisError> errors = errorListener.getErrorsForSource(source);
       _hintMap[source] = new TimestampedData<List<AnalysisError>>(unitData.modificationTime, errors);
     }
   }
@@ -10877,7 +10889,12 @@
   /**
    * The time at which the contents of the source were last modified.
    */
-  int _modificationTime = -1;
+  final int modificationTime;
+
+  /**
+   * The head of the token stream used for parsing.
+   */
+  Token _tokenStream;
 
   /**
    * The compilation unit that was produced by parsing the source.
@@ -10904,8 +10921,12 @@
    *
    * @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 tokenStream the head of the token stream used for parsing
    */
-  ParseDartTask(InternalAnalysisContext context, this.source) : super(context);
+  ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, Token tokenStream) : super(context) {
+    this._tokenStream = tokenStream;
+  }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
 
@@ -10926,20 +10947,12 @@
   List<AnalysisError> get errors => _errors;
 
   /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
-  /**
    * Return `true` if the source contains a 'library' directive, or `false` if the task
    * has not yet been performed or if an exception occurred.
    *
    * @return `true` if the source contains a 'library' directive
    */
-  bool hasLibraryDirective() => _containsLibraryDirective;
+  bool get hasLibraryDirective => _containsLibraryDirective;
 
   /**
    * Return `true` if the source contains a 'part of' directive, or `false` if the task
@@ -10947,7 +10960,7 @@
    *
    * @return `true` if the source contains a 'part of' directive
    */
-  bool hasPartOfDirective() => _containsPartOfDirective;
+  bool get hasPartOfDirective => _containsPartOfDirective;
 
   String get taskDescription {
     if (source == null) {
@@ -10959,12 +10972,6 @@
   void internalPerform() {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     InternalAnalysisContext context = this.context;
-    TimestampedData<Token> data = context.internalScanTokenStream(source);
-    _modificationTime = data.modificationTime;
-    Token token = data.data;
-    if (token == null) {
-      throw new AnalysisException.con1("Could not get token stream for ${source.fullName}");
-    }
     //
     // Then parse the token stream.
     //
@@ -10972,8 +10979,8 @@
     try {
       Parser parser = new Parser(source, errorListener);
       parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
-      _unit = parser.parseCompilationUnit(token);
-      _errors = errorListener.getErrors2(source);
+      _unit = parser.parseCompilationUnit(_tokenStream);
+      _errors = errorListener.getErrorsForSource(source);
       for (Directive directive in _unit.directives) {
         if (directive is LibraryDirective) {
           _containsLibraryDirective = true;
@@ -10998,16 +11005,16 @@
   final Source source;
 
   /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
    * The contents of the source.
    */
   String _content;
 
   /**
-   * The time at which the contents of the source were last modified.
-   */
-  int _modificationTime = 0;
-
-  /**
    * The line information that was produced.
    */
   LineInfo _lineInfo;
@@ -11042,11 +11049,11 @@
    *
    * @param context the context in which the task is to be performed
    * @param source the source to be parsed
-   * @param contentData the time-stamped contents of the source
+   * @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, TimestampedData<String> contentData) : super(context) {
-    _content = contentData.data;
-    _modificationTime = contentData.modificationTime;
+  ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+    this._content = content;
   }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
@@ -11075,14 +11082,6 @@
   LineInfo get lineInfo => _lineInfo;
 
   /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
-  /**
    * Return an array containing the sources of the libraries that are referenced within the HTML.
    *
    * @return the sources of the libraries that are referenced within the HTML
@@ -11104,7 +11103,7 @@
       _lineInfo = new LineInfo(scanner.lineStarts);
       RecordingErrorListener errorListener = new RecordingErrorListener();
       _unit = new ht.HtmlParser(source, errorListener).parse(token, _lineInfo);
-      _errors = errorListener.getErrors2(source);
+      _errors = errorListener.getErrorsForSource(source);
       _referencedLibraries = librarySources;
     } on JavaException catch (exception) {
       throw new AnalysisException.con3(exception);
@@ -11161,6 +11160,21 @@
  */
 class ResolveAngularComponentTemplateTask extends AnalysisTask {
   /**
+   * The source to be resolved.
+   */
+  final Source source;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The HTML unit to be resolved.
+   */
+  ht.HtmlUnit _unit;
+
+  /**
    * The [AngularComponentElement] to resolve template for.
    */
   AngularComponentElement _component;
@@ -11171,16 +11185,6 @@
   AngularApplication _application;
 
   /**
-   * The source to be resolved.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  int _modificationTime = -1;
-
-  /**
    * The [HtmlUnit] that was resolved by this task.
    */
   ht.HtmlUnit _resolvedUnit;
@@ -11195,24 +11199,19 @@
    *
    * @param context the context in which the task is to be performed
    * @param source the source to be resolved
+   * @param modificationTime the time at which the contents of the source were last modified
+   * @param unit the HTML unit to be resolved
    * @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, AngularComponentElement component, AngularApplication application) : super(context) {
+  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+    this._unit = unit;
     this._component = component;
     this._application = application;
   }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularComponentTemplateTask(this);
 
-  /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
   List<AnalysisError> get resolutionErrors => _resolutionErrors;
 
   /**
@@ -11225,23 +11224,23 @@
   String get taskDescription => "resolving Angular template ${source}";
 
   void internalPerform() {
-    ResolvableHtmlUnit resolvableHtmlUnit = context.computeResolvableAngularComponentHtmlUnit(source);
-    ht.HtmlUnit unit = resolvableHtmlUnit.compilationUnit;
-    if (unit == null) {
-      throw new AnalysisException.con1("Internal error: computeResolvableHtmlUnit returned a value without a parsed HTML unit");
-    }
-    _modificationTime = resolvableHtmlUnit.modificationTime;
-    // prepare for resolution
+    //
+    // Prepare for resolution.
+    //
     RecordingErrorListener errorListener = new RecordingErrorListener();
     LineInfo lineInfo = context.getLineInfo(source);
-    // do resolve
+    //
+    // Perform resolution.
+    //
     if (_application != null) {
-      AngularHtmlUnitResolver resolver = new AngularHtmlUnitResolver(context, errorListener, source, lineInfo, unit);
+      AngularHtmlUnitResolver resolver = new AngularHtmlUnitResolver(context, errorListener, source, lineInfo, _unit);
       resolver.resolveComponentTemplate(_application, _component);
-      _resolvedUnit = unit;
+      _resolvedUnit = _unit;
     }
-    // remember errors
-    _resolutionErrors = errorListener.getErrors2(source);
+    //
+    // Remember the errors.
+    //
+    _resolutionErrors = errorListener.getErrorsForSource(source);
   }
 }
 
@@ -11256,16 +11255,21 @@
   final Source source;
 
   /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The HTML unit to be resolved.
+   */
+  ht.HtmlUnit _unit;
+
+  /**
    * The listener to record errors.
    */
   RecordingErrorListener _errorListener = new RecordingErrorListener();
 
   /**
-   * The time at which the contents of the source were last modified.
-   */
-  int _modificationTime = -1;
-
-  /**
    * The [HtmlUnit] that was resolved by this task.
    */
   ht.HtmlUnit _resolvedUnit;
@@ -11285,8 +11289,12 @@
    *
    * @param context the context in which the task is to be performed
    * @param source the source to be resolved
+   * @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) : super(context);
+  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+    this._unit = unit;
+  }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularEntryHtmlTask(this);
 
@@ -11301,20 +11309,12 @@
   /**
    * The resolution errors that were discovered while resolving the source.
    */
-  List<AnalysisError> get entryErrors => _errorListener.getErrors2(source);
+  List<AnalysisError> get entryErrors => _errorListener.getErrorsForSource(source);
 
   /**
    * Returns [AnalysisError]s recorded for the given [Source].
    */
-  List<AnalysisError> getErrors(Source source) => _errorListener.getErrors2(source);
-
-  /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
+  List<AnalysisError> getErrors(Source source) => _errorListener.getErrorsForSource(source);
 
   /**
    * Return the [HtmlUnit] that was resolved by this task.
@@ -11331,22 +11331,24 @@
   }
 
   void internalPerform() {
-    ResolvableHtmlUnit resolvableHtmlUnit = context.computeResolvableAngularComponentHtmlUnit(source);
-    ht.HtmlUnit unit = resolvableHtmlUnit.compilationUnit;
-    if (unit == null) {
-      throw new AnalysisException.con1("Internal error: computeResolvableHtmlUnit returned a value without a parsed HTML unit");
-    }
-    _modificationTime = resolvableHtmlUnit.modificationTime;
-    // prepare for resolution
+    //
+    // Prepare for resolution.
+    //
     LineInfo lineInfo = context.getLineInfo(source);
-    // try to resolve as an Angular entry point
-    _application = new AngularHtmlUnitResolver(context, _errorListener, source, lineInfo, unit).calculateAngularApplication();
-    // do resolve
+    //
+    // Try to resolve as an Angular entry point.
+    //
+    _application = new AngularHtmlUnitResolver(context, _errorListener, source, lineInfo, _unit).calculateAngularApplication();
+    //
+    // Perform resolution.
+    //
     if (_application != null) {
-      new AngularHtmlUnitResolver(context, _errorListener, source, lineInfo, unit).resolveEntryPoint(_application);
+      new AngularHtmlUnitResolver(context, _errorListener, source, lineInfo, _unit).resolveEntryPoint(_application);
     }
-    // remember resolved unit
-    _resolvedUnit = unit;
+    //
+    // Remember the resolved unit.
+    //
+    _resolvedUnit = _unit;
   }
 }
 
@@ -11363,7 +11365,12 @@
   /**
    * The time at which the contents of the source were last modified.
    */
-  int _modificationTime = -1;
+  final int modificationTime;
+
+  /**
+   * The compilation unit used to resolve the dependencies.
+   */
+  CompilationUnit _unit;
 
   /**
    * A set containing the sources referenced by 'export' directives.
@@ -11385,8 +11392,12 @@
    *
    * @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) : super(context);
+  ResolveDartDependenciesTask(InternalAnalysisContext context, this.source, this.modificationTime, CompilationUnit unit) : super(context) {
+    this._unit = unit;
+  }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartDependenciesTask(this);
 
@@ -11414,14 +11425,6 @@
    */
   List<Source> get includedSources => toArray(_includedSources);
 
-  /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
   String get taskDescription {
     if (source == null) {
       return "resolve dart dependencies null source";
@@ -11430,11 +11433,9 @@
   }
 
   void internalPerform() {
-    TimestampedData<CompilationUnit> unit = context.internalParseCompilationUnit(source);
-    _modificationTime = unit.modificationTime;
     TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
     try {
-      for (Directive directive in unit.data.directives) {
+      for (Directive directive in _unit.directives) {
         if (directive is ExportDirective) {
           Source exportSource = resolveSource(source, directive);
           if (exportSource != null) {
@@ -11700,7 +11701,12 @@
   /**
    * The time at which the contents of the source were last modified.
    */
-  int _modificationTime = -1;
+  final int modificationTime;
+
+  /**
+   * The HTML unit to be resolved.
+   */
+  ht.HtmlUnit _unit;
 
   /**
    * The [HtmlUnit] that was resolved by this task.
@@ -11722,21 +11728,17 @@
    *
    * @param context the context in which the task is to be performed
    * @param source the source to be resolved
+   * @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) : super(context);
+  ResolveHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+    this._unit = unit;
+  }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this);
 
   HtmlElement get element => _element;
 
-  /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
   List<AnalysisError> get resolutionErrors => _resolutionErrors;
 
   /**
@@ -11754,20 +11756,20 @@
   }
 
   void internalPerform() {
-    ResolvableHtmlUnit resolvableHtmlUnit = context.computeResolvableHtmlUnit(source);
-    ht.HtmlUnit unit = resolvableHtmlUnit.compilationUnit;
-    if (unit == null) {
-      throw new AnalysisException.con1("Internal error: computeResolvableHtmlUnit returned a value without a parsed HTML unit");
-    }
-    _modificationTime = resolvableHtmlUnit.modificationTime;
-    // build standard HTML element
+    //
+    // Build the standard HTML element.
+    //
     HtmlUnitBuilder builder = new HtmlUnitBuilder(context);
-    _element = builder.buildHtmlElement2(source, _modificationTime, unit);
+    _element = builder.buildHtmlElement(source, modificationTime, _unit);
     RecordingErrorListener errorListener = builder.errorListener;
-    // record all resolution errors
-    _resolutionErrors = errorListener.getErrors2(source);
-    // remember resolved unit
-    _resolvedUnit = unit;
+    //
+    // Record all resolution errors.
+    //
+    _resolutionErrors = errorListener.getErrorsForSource(source);
+    //
+    // Remember the resolved unit.
+    //
+    _resolvedUnit = _unit;
   }
 }
 
@@ -11781,16 +11783,16 @@
   final Source source;
 
   /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
    * The contents of the source.
    */
   String _content;
 
   /**
-   * The time at which the contents of the source were last modified.
-   */
-  int _modificationTime = 0;
-
-  /**
    * The token stream that was produced by scanning the source.
    */
   Token _tokenStream;
@@ -11810,11 +11812,11 @@
    *
    * @param context the context in which the task is to be performed
    * @param source the source to be parsed
-   * @param contentData the time-stamped contents of the source
+   * @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, TimestampedData<String> contentData) : super(context) {
-    this._content = contentData.data;
-    this._modificationTime = contentData.modificationTime;
+  ScanDartTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+    this._content = content;
   }
 
   accept(AnalysisTaskVisitor visitor) => visitor.visitScanDartTask(this);
@@ -11836,14 +11838,6 @@
   LineInfo get lineInfo => _lineInfo;
 
   /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
-  /**
    * Return the token stream that was produced by scanning the source, or `null` if the task
    * has not yet been performed or if an exception occurred.
    *
@@ -11866,7 +11860,7 @@
       scanner.preserveComments = context.analysisOptions.preserveComments;
       _tokenStream = scanner.tokenize();
       _lineInfo = new LineInfo(scanner.lineStarts);
-      _errors = errorListener.getErrors2(source);
+      _errors = errorListener.getErrorsForSource(source);
     } on JavaException catch (exception) {
       throw new AnalysisException.con3(exception);
     } finally {
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 031254b..8830651 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -282,8 +282,8 @@
    * @param node the node specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError2(ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    reportError4(errorCode, node.offset, node.length, arguments);
+  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
   }
 
   /**
@@ -293,8 +293,8 @@
    * @param element the element which name should be used as the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError3(ErrorCode errorCode, Element element, List<Object> arguments) {
-    reportError4(errorCode, element.nameOffset, element.displayName.length, arguments);
+  void reportErrorForElement(ErrorCode errorCode, Element element, List<Object> arguments) {
+    reportErrorForOffset(errorCode, element.nameOffset, element.displayName.length, arguments);
   }
 
   /**
@@ -305,7 +305,7 @@
    * @param length the length of the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError4(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
   }
 
@@ -316,8 +316,8 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError5(ErrorCode errorCode, Token token, List<Object> arguments) {
-    reportError4(errorCode, token.offset, token.length, arguments);
+  void reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
+    reportErrorForOffset(errorCode, token.offset, token.length, arguments);
   }
 
   /**
@@ -2472,7 +2472,13 @@
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
    * named <i>n</i> and has a setter named <i>n=</i>.
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method %s and has a setter with the same name from '%s'");
+  static final StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
+   * named <i>n</i> and has a setter named <i>n=</i>.
+   */
+  static final StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = new StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 11, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
 
   /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
@@ -2481,31 +2487,31 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 11, "Superclass '%s' declares static member with the same name");
+  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 12, "Class '%s' declares non-static setter with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 13, "Class '%s' declares non-static member with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
 
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 14, "Abstract classes cannot be created with a 'const' expression");
+  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
 
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 15, "Keys in a map cannot be equal");
+  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
 
   /**
    * 14.2 Exports: It is a static warning to export two different libraries with the same name.
@@ -2514,7 +2520,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the exported libraries
    */
-  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 16, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2524,13 +2530,13 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
    */
-  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 17, "%d positional arguments expected, but %d found");
+  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
    * its point of declaration is also initialized in a constructor.
    */
-  static final StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 18, "Values cannot be set in the constructor if they are final, and have already been set");
+  static final StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 19, "Values cannot be set in the constructor if they are final, and have already been set");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
@@ -2538,7 +2544,7 @@
    *
    * @param name the name of the field in question
    */
-  static final StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 19, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static final StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 20, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
 
   /**
    * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
@@ -2555,7 +2561,7 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 20, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -2564,7 +2570,7 @@
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 21, "The parameter type '%s' is incompatable with the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -2579,13 +2585,13 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 22, "The final variable '%s' must be initialized");
+  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
 
   /**
    * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
    * not have a concrete method named call().
    */
-  static final StaticWarningCode FUNCTION_WITHOUT_CALL = new StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 23, "Concrete classes that implement Function must implement the method call()");
+  static final StaticWarningCode FUNCTION_WITHOUT_CALL = new StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 24, "Concrete classes that implement Function must implement the method call()");
 
   /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
@@ -2594,7 +2600,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the imported libraries
    */
-  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 24, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 25, "The imported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
@@ -2606,7 +2612,7 @@
    * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
    * inherited, and a static warning is issued.
    */
-  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 25, "'%s' is inherited as a getter and also a method");
+  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 26, "'%s' is inherited as a getter and also a method");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -2616,7 +2622,7 @@
    * @param memberName the name of the member with the name conflict
    * @param superclassName the name of the enclosing class that has the static member
    */
-  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 26, "'%s' collides with a static member in the superclass '%s'");
+  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 27, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -2628,7 +2634,7 @@
    * @param className the name of the class where the overridden getter is declared
    * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 27, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 28, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2639,7 +2645,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 28, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2651,7 +2657,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2662,7 +2668,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2674,7 +2680,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 31, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 32, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2682,7 +2688,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 32, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 33, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2690,7 +2696,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 33, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 34, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2700,7 +2706,7 @@
    * @param paramCount the number of named parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 34, "Missing the named parameter '%s' to match the overridden method from '%s'");
+  static final StaticWarningCode INVALID_OVERRIDE_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 35, "Missing the named parameter '%s' to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2709,7 +2715,7 @@
    * @param paramCount the number of positional parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 35, "Must have at least %d parameters to match the overridden method from '%s'");
+  static final StaticWarningCode INVALID_OVERRIDE_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 36, "Must have at least %d parameters to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2719,7 +2725,7 @@
    * @param paramCount the number of required parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_REQUIRED = new StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 36, "Must have %d required parameters or less to match the overridden method from '%s'");
+  static final StaticWarningCode INVALID_OVERRIDE_REQUIRED = new StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 37, "Must have %d required parameters or less to match the overridden method from '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -2731,7 +2737,7 @@
    * @param className the name of the class where the overridden setter is declared
    * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 37, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 38, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -2745,7 +2751,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 38, "The element type '%s' cannot be assigned to the list type '%s'");
+  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 39, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -2759,7 +2765,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 39, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -2773,33 +2779,33 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 41, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 42, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 42, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
 
   /**
    * 13.12 Return: It is a static warning if a function contains both one or more return statements
    * of the form <i>return;</i> and one or more return statements of the form <i>return e;</i>.
    */
-  static final StaticWarningCode MIXED_RETURN_TYPES = new StaticWarningCode.con1('MIXED_RETURN_TYPES', 43, "Methods and functions cannot use return both with and without values");
+  static final StaticWarningCode MIXED_RETURN_TYPES = new StaticWarningCode.con1('MIXED_RETURN_TYPES', 44, "Methods and functions cannot use return both with and without values");
 
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 44, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 45, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
@@ -2810,7 +2816,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 45, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 46, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
@@ -2818,7 +2824,7 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode.con1('NEW_WITH_NON_TYPE', 46, "The name '%s' is not a class");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode.con1('NEW_WITH_NON_TYPE', 47, "The name '%s' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2829,7 +2835,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 47, "The class '%s' does not have a constructor '%s'");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 48, "The class '%s' does not have a constructor '%s'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2840,7 +2846,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 48, "The class '%s' does not have a default constructor");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 49, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2860,7 +2866,7 @@
    * @param memberName the name of the fourth member
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 49, "Missing concrete implementation of '%s', '%s', '%s', '%s' and %d more");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 50, "Missing concrete implementation of '%s', '%s', '%s', '%s' and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2879,7 +2885,7 @@
    * @param memberName the name of the third member
    * @param memberName the name of the fourth member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 50, "Missing concrete implementation of '%s', '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 51, "Missing concrete implementation of '%s', '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2895,7 +2901,7 @@
    *
    * @param memberName the name of the member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 51, "Missing concrete implementation of '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 52, "Missing concrete implementation of '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2913,7 +2919,7 @@
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 52, "Missing concrete implementation of '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 53, "Missing concrete implementation of '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2930,7 +2936,7 @@
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 53, "Missing concrete implementation of '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 54, "Missing concrete implementation of '%s' and '%s'");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
@@ -2940,18 +2946,18 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 54, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 55, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 55, "The return type of the operator []= must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 56, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 56, "The return type of the setter must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 57, "The return type of the setter must be 'void'");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
@@ -2964,7 +2970,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode.con1('NOT_A_TYPE', 57, "%s is not a type");
+  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode.con1('NOT_A_TYPE', 58, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2974,7 +2980,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #EXTRA_POSITIONAL_ARGUMENTS
    */
-  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 58, "%d required argument(s) expected, but %d found");
+  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 59, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -2983,7 +2989,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 59, "Expected this library to be part of '%s', not '%s'");
+  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 60, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2992,7 +2998,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 60, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 61, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3001,21 +3007,21 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 61, "The return type '%s' of the redirected constructor is not assignable to '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 62, "The return type '%s' of the redirected constructor is not assignable to '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 62, "The constructor '%s' could not be found in '%s'");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 63, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 63, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 64, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
@@ -3025,7 +3031,7 @@
    * * The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 64, "Missing return value after 'return'");
+  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 65, "Missing return value after 'return'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3033,19 +3039,19 @@
    *
    * @param memberName the name of the instance member
    */
-  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 65, "Instance member '%s' cannot be accessed using static access");
+  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 66, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 66, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 67, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
 
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 67, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 68, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
    * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
@@ -3054,7 +3060,7 @@
    * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
    * is then interpreted as dynamic by the static type checker and the runtime.
    */
-  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 68, "Static members cannot reference type parameters");
+  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 69, "Static members cannot reference type parameters");
 
   /**
    * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
@@ -3064,12 +3070,12 @@
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode.con1('UNDEFINED_CLASS', 69, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode.con1('UNDEFINED_CLASS', 70, "Undefined class '%s'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 70, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 71, "Undefined class 'boolean'; did you mean 'bool'?");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -3079,7 +3085,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode.con1('UNDEFINED_GETTER', 71, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode.con1('UNDEFINED_GETTER', 72, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -3089,7 +3095,7 @@
    *
    * @param name the name of the identifier
    */
-  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 72, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 73, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -3098,7 +3104,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 73, "The named parameter '%s' is not defined");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 74, "The named parameter '%s' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -3113,7 +3119,7 @@
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode.con1('UNDEFINED_SETTER', 74, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode.con1('UNDEFINED_SETTER', 75, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3122,7 +3128,7 @@
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 75, "There is no such static method, getter or setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 76, "There is no such static method, getter or setter '%s' in '%s'");
 
   static final List<StaticWarningCode> values = [
       AMBIGUOUS_IMPORT,
@@ -3136,6 +3142,7 @@
       CONFLICTING_DART_IMPORT,
       CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
       CONFLICTING_INSTANCE_METHOD_SETTER,
+      CONFLICTING_INSTANCE_METHOD_SETTER2,
       CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
       CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
       CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 97df6cd..c8b4c3b 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -230,7 +230,7 @@
    * Returns the [Element] of the [Expression] in the given [HtmlUnit], enclosing
    * the given offset.
    */
-  static Element getElement2(HtmlUnit htmlUnit, int offset) {
+  static Element getElementAtOffset(HtmlUnit htmlUnit, int offset) {
     Expression expression = getExpression(htmlUnit, offset);
     return getElement(expression);
   }
@@ -524,12 +524,26 @@
   void visitChildren(XmlVisitor visitor);
 
   /**
+   * Make this node the parent of the given child node.
+   *
+   * @param child the node that will become a child of this node
+   * @return the node that was made a child of this node
+   */
+  XmlNode becomeParentOf(XmlNode child) {
+    if (child != null) {
+      XmlNode node = child;
+      node.parent = this;
+    }
+    return child;
+  }
+
+  /**
    * Make this node the parent of the given child nodes.
    *
    * @param children the nodes that will become the children of this node
    * @return the nodes that were made children of this node
    */
-  List becomeParentOf(List children) {
+  List becomeParentOfAll(List children) {
     if (children != null) {
       for (JavaIterator iter = new JavaIterator(children); iter.hasNext;) {
         XmlNode node = iter.next();
@@ -542,20 +556,6 @@
   }
 
   /**
-   * Make this node the parent of the given child node.
-   *
-   * @param child the node that will become a child of this node
-   * @return the node that was made a child of this node
-   */
-  XmlNode becomeParentOf2(XmlNode child) {
-    if (child != null) {
-      XmlNode node = child;
-      node.parent = this;
-    }
-    return child;
-  }
-
-  /**
    * This method exists for debugging purposes only.
    */
   void appendIdentifier(JavaStringBuilder builder, XmlNode node) {
@@ -749,9 +749,9 @@
     return token;
   }
 
-  Token emit2(TokenType type, int start) => emit(new Token.con1(type, start));
+  Token emitWithOffset(TokenType type, int start) => emit(new Token.con1(type, start));
 
-  Token emit3(TokenType type, int start, int count) => emit(new Token.con2(type, start, getString(start, count)));
+  Token emitWithOffsetAndLength(TokenType type, int start, int count) => emit(new Token.con2(type, start, getString(start, count)));
 
   Token firstToken() => _tokens.next;
 
@@ -796,7 +796,7 @@
               }
               c = recordStartOfLineAndAdvance(c);
             }
-            emit3(TokenType.COMMENT, start, -1);
+            emitWithOffsetAndLength(TokenType.COMMENT, start, -1);
             // Capture <!--> and <!---> as tokens but report an error
             if (_tail.length < 7) {
             }
@@ -809,7 +809,7 @@
               }
               c = recordStartOfLineAndAdvance(c);
             }
-            emit3(TokenType.DECLARATION, start, -1);
+            emitWithOffsetAndLength(TokenType.DECLARATION, start, -1);
             if (!StringUtilities.endsWithChar(_tail.lexeme, 0x3E)) {
             }
           }
@@ -826,16 +826,16 @@
               c = recordStartOfLineAndAdvance(c);
             }
           }
-          emit3(TokenType.DIRECTIVE, start, -1);
+          emitWithOffsetAndLength(TokenType.DIRECTIVE, start, -1);
           if (_tail.length < 4) {
           }
         } else if (c == 0x2F) {
-          emit2(TokenType.LT_SLASH, start);
+          emitWithOffset(TokenType.LT_SLASH, start);
           inBrackets = true;
           c = advance();
         } else {
           inBrackets = true;
-          emit2(TokenType.LT, start);
+          emitWithOffset(TokenType.LT, start);
           // ignore whitespace in braces
           while (Character.isWhitespace(c)) {
             c = recordStartOfLineAndAdvance(c);
@@ -847,7 +847,7 @@
             while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
               c = advance();
             }
-            emit3(TokenType.TAG, tagStart, -1);
+            emitWithOffsetAndLength(TokenType.TAG, tagStart, -1);
             // check tag against passThrough elements
             String tag = _tail.lexeme;
             for (String str in _passThroughElements) {
@@ -859,7 +859,7 @@
           }
         }
       } else if (c == 0x3E) {
-        emit2(TokenType.GT, start);
+        emitWithOffset(TokenType.GT, start);
         inBrackets = false;
         c = advance();
         // if passThrough != null, read until we match it
@@ -888,18 +888,18 @@
           }
           if (start + 1 < offset) {
             if (endFound) {
-              emit3(TokenType.TEXT, start + 1, -len);
-              emit2(TokenType.LT_SLASH, offset - len + 1);
-              emit3(TokenType.TAG, offset - len + 3, -1);
+              emitWithOffsetAndLength(TokenType.TEXT, start + 1, -len);
+              emitWithOffset(TokenType.LT_SLASH, offset - len + 1);
+              emitWithOffsetAndLength(TokenType.TAG, offset - len + 3, -1);
             } else {
-              emit3(TokenType.TEXT, start + 1, -1);
+              emitWithOffsetAndLength(TokenType.TEXT, start + 1, -1);
             }
           }
           endPassThrough = null;
         }
       } else if (c == 0x2F && peek() == 0x3E) {
         advance();
-        emit2(TokenType.SLASH_GT, start);
+        emitWithOffset(TokenType.SLASH_GT, start);
         inBrackets = false;
         c = advance();
       } else if (!inBrackets) {
@@ -907,7 +907,7 @@
         while (c != 0x3C && c >= 0) {
           c = recordStartOfLineAndAdvance(c);
         }
-        emit3(TokenType.TEXT, start, -1);
+        emitWithOffsetAndLength(TokenType.TEXT, start, -1);
       } else if (c == 0x22 || c == 0x27) {
         // read a string
         int endQuote = c;
@@ -919,10 +919,10 @@
           }
           c = recordStartOfLineAndAdvance(c);
         }
-        emit3(TokenType.STRING, start, -1);
+        emitWithOffsetAndLength(TokenType.STRING, start, -1);
       } else if (c == 0x3D) {
         // a non-char token
-        emit2(TokenType.EQ, start);
+        emitWithOffset(TokenType.EQ, start);
         c = advance();
       } else if (Character.isWhitespace(c)) {
         // ignore whitespace in braces
@@ -934,10 +934,10 @@
         while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
           c = advance();
         }
-        emit3(TokenType.TAG, start, -1);
+        emitWithOffsetAndLength(TokenType.TAG, start, -1);
       } else {
         // a non-char token
-        emit3(TokenType.TEXT, start, 0);
+        emitWithOffsetAndLength(TokenType.TEXT, start, 0);
         c = advance();
       }
     }
@@ -1777,13 +1777,13 @@
   }
 
   /**
-   * Same as [becomeParentOf], but returns given "ifEmpty" if "children" is empty
+   * Same as [becomeParentOfAll], but returns given "ifEmpty" if "children" is empty
    */
   List becomeParentOfEmpty(List children, List ifEmpty) {
     if (children != null && children.isEmpty) {
       return ifEmpty;
     }
-    return becomeParentOf(children);
+    return becomeParentOfAll(children);
   }
 }
 
@@ -1943,7 +1943,7 @@
    *          [TokenType.EOF]
    */
   HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
-    this._tagNodes = becomeParentOf(tagNodes);
+    this._tagNodes = becomeParentOfAll(tagNodes);
   }
 
   accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index 5133837..b95f79e 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -168,7 +168,7 @@
 
   int _locationCount = 0;
 
-  bool aboutToIndex(AnalysisContext context, CompilationUnitElement unitElement) {
+  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement) {
     context = unwrapContext(context);
     // may be already removed in other thread
     if (isRemovedContext(context)) {
@@ -232,7 +232,7 @@
     return true;
   }
 
-  bool aboutToIndex2(AnalysisContext context, HtmlElement htmlElement) {
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
     context = unwrapContext(context);
     // may be already removed in other thread
     if (isRemovedContext(context)) {
@@ -279,7 +279,7 @@
     return count;
   }
 
-  int internalGetLocationCount2(AnalysisContext context) {
+  int internalGetLocationCountForContext(AnalysisContext context) {
     context = unwrapContext(context);
     int count = 0;
     for (Set<Location> locations in _keyToLocations.values) {
@@ -648,7 +648,7 @@
 
   void performOperation() {
     try {
-      bool mayIndex = _indexStore.aboutToIndex(_context, _unitElement);
+      bool mayIndex = _indexStore.aboutToIndexDart(_context, _unitElement);
       if (!mayIndex) {
         return;
       }
@@ -1391,7 +1391,7 @@
    * @return `true` the given [AnalysisContext] is active, or `false` if it was
    *         removed before, so no any unit may be indexed with it
    */
-  bool aboutToIndex(AnalysisContext context, CompilationUnitElement unitElement);
+  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement);
 
   /**
    * Notifies the index store that we are going to index the given [HtmlElement].
@@ -1401,7 +1401,7 @@
    * @return `true` the given [AnalysisContext] is active, or `false` if it was
    *         removed before, so no any unit may be indexed with it
    */
-  bool aboutToIndex2(AnalysisContext context, HtmlElement htmlElement);
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
 
   /**
    * Return the locations of the elements that have the given relationship with the given element.
@@ -1552,7 +1552,7 @@
     // find ImportElement
     String prefix = prefixNode.name;
     Map<ImportElement, Set<Element>> importElementsMap = {};
-    info._element = getImportElement2(libraryElement, prefix, usedElement, importElementsMap);
+    info._element = internalGetImportElement(libraryElement, prefix, usedElement, importElementsMap);
     if (info._element == null) {
       return null;
     }
@@ -1560,77 +1560,6 @@
   }
 
   /**
-   * @return the [ImportElement] that declares given [PrefixElement] and imports library
-   *         with given "usedElement".
-   */
-  static ImportElement getImportElement2(LibraryElement libraryElement, String prefix, Element usedElement, Map<ImportElement, Set<Element>> importElementsMap) {
-    // validate Element
-    if (usedElement == null) {
-      return null;
-    }
-    if (usedElement.enclosingElement is! CompilationUnitElement) {
-      return null;
-    }
-    LibraryElement usedLibrary = usedElement.library;
-    // find ImportElement that imports used library with used prefix
-    List<ImportElement> candidates = null;
-    for (ImportElement importElement in libraryElement.imports) {
-      // required library
-      if (importElement.importedLibrary != usedLibrary) {
-        continue;
-      }
-      // required prefix
-      PrefixElement prefixElement = importElement.prefix;
-      if (prefix == null) {
-        if (prefixElement != null) {
-          continue;
-        }
-      } else {
-        if (prefixElement == null) {
-          continue;
-        }
-        if (prefix != prefixElement.name) {
-          continue;
-        }
-      }
-      // no combinators => only possible candidate
-      if (importElement.combinators.length == 0) {
-        return importElement;
-      }
-      // OK, we have candidate
-      if (candidates == null) {
-        candidates = [];
-      }
-      candidates.add(importElement);
-    }
-    // no candidates, probably element is defined in this library
-    if (candidates == null) {
-      return null;
-    }
-    // one candidate
-    if (candidates.length == 1) {
-      return candidates[0];
-    }
-    // ensure that each ImportElement has set of elements
-    for (ImportElement importElement in candidates) {
-      if (importElementsMap.containsKey(importElement)) {
-        continue;
-      }
-      Namespace namespace = new NamespaceBuilder().createImportNamespace(importElement);
-      Set<Element> elements = new Set();
-      importElementsMap[importElement] = elements;
-    }
-    // use import namespace to choose correct one
-    for (MapEntry<ImportElement, Set<Element>> entry in getMapEntrySet(importElementsMap)) {
-      if (entry.getValue().contains(usedElement)) {
-        return entry.getKey();
-      }
-    }
-    // not found
-    return null;
-  }
-
-  /**
    * If the given expression has resolved type, returns the new location with this type.
    *
    * @param location the base location
@@ -1714,6 +1643,77 @@
   }
 
   /**
+   * @return the [ImportElement] that declares given [PrefixElement] and imports library
+   *         with given "usedElement".
+   */
+  static ImportElement internalGetImportElement(LibraryElement libraryElement, String prefix, Element usedElement, Map<ImportElement, Set<Element>> importElementsMap) {
+    // validate Element
+    if (usedElement == null) {
+      return null;
+    }
+    if (usedElement.enclosingElement is! CompilationUnitElement) {
+      return null;
+    }
+    LibraryElement usedLibrary = usedElement.library;
+    // find ImportElement that imports used library with used prefix
+    List<ImportElement> candidates = null;
+    for (ImportElement importElement in libraryElement.imports) {
+      // required library
+      if (importElement.importedLibrary != usedLibrary) {
+        continue;
+      }
+      // required prefix
+      PrefixElement prefixElement = importElement.prefix;
+      if (prefix == null) {
+        if (prefixElement != null) {
+          continue;
+        }
+      } else {
+        if (prefixElement == null) {
+          continue;
+        }
+        if (prefix != prefixElement.name) {
+          continue;
+        }
+      }
+      // no combinators => only possible candidate
+      if (importElement.combinators.length == 0) {
+        return importElement;
+      }
+      // OK, we have candidate
+      if (candidates == null) {
+        candidates = [];
+      }
+      candidates.add(importElement);
+    }
+    // no candidates, probably element is defined in this library
+    if (candidates == null) {
+      return null;
+    }
+    // one candidate
+    if (candidates.length == 1) {
+      return candidates[0];
+    }
+    // ensure that each ImportElement has set of elements
+    for (ImportElement importElement in candidates) {
+      if (importElementsMap.containsKey(importElement)) {
+        continue;
+      }
+      Namespace namespace = new NamespaceBuilder().createImportNamespaceForDirective(importElement);
+      Set<Element> elements = new Set();
+      importElementsMap[importElement] = elements;
+    }
+    // use import namespace to choose correct one
+    for (MapEntry<ImportElement, Set<Element>> entry in getMapEntrySet(importElementsMap)) {
+      if (entry.getValue().contains(usedElement)) {
+        return entry.getKey();
+      }
+    }
+    // not found
+    return null;
+  }
+
+  /**
    * @return `true` if given "node" is part of an import [Combinator].
    */
   static bool isIdentifierInImportCombinator(SimpleIdentifier node) {
@@ -1924,7 +1924,7 @@
   }
 
   Object visitExportDirective(ExportDirective node) {
-    ExportElement element = node.element as ExportElement;
+    ExportElement element = node.element;
     if (element != null) {
       LibraryElement expLibrary = element.exportedLibrary;
       recordLibraryReference(node, expLibrary);
@@ -2234,7 +2234,7 @@
       return;
     }
     Element element = node.staticElement;
-    ImportElement importElement = getImportElement2(_libraryElement, null, element, _importElementsMap);
+    ImportElement importElement = internalGetImportElement(_libraryElement, null, element, _importElementsMap);
     if (importElement != null) {
       Location location = createLocationFromOffset(node.offset, 0);
       recordRelationship(importElement, IndexConstants.IS_REFERENCED_BY, location);
@@ -2650,7 +2650,7 @@
 
   void performOperation() {
     try {
-      bool mayIndex = _indexStore.aboutToIndex2(_context, _htmlElement);
+      bool mayIndex = _indexStore.aboutToIndexHtml(_context, _htmlElement);
       if (!mayIndex) {
         return;
       }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 9bb9313..42a5242 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1697,7 +1697,7 @@
         return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, null, null, null, null, null, createSyntheticIdentifier(), new FormalParameterList(null, new List<FormalParameter>(), null, null, null), new EmptyFunctionBody(createSyntheticToken(TokenType.SEMICOLON)));
       }
       return null;
-    } else if (tokenMatches(peek(), TokenType.PERIOD) && tokenMatchesIdentifier(peek2(2)) && tokenMatches(peek2(3), TokenType.OPEN_PAREN)) {
+    } else if (tokenMatches(peek(), TokenType.PERIOD) && tokenMatchesIdentifier(peekAt(2)) && tokenMatches(peekAt(3), TokenType.OPEN_PAREN)) {
       return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
     } else if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
       SimpleIdentifier methodName = parseSimpleIdentifier();
@@ -2896,7 +2896,7 @@
    * @return `true` if we can successfully parse the rest of a type alias if we first parse a
    *         return type.
    */
-  bool hasReturnTypeInTypeAlias() {
+  bool get hasReturnTypeInTypeAlias {
     Token next = skipReturnType(_currentToken);
     if (next == null) {
       return false;
@@ -4075,7 +4075,7 @@
           if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
             bodyAllowed = false;
             initializers.add(parseRedirectingConstructorInvocation());
-          } else if (tokenMatches(peek(), TokenType.PERIOD) && tokenMatches(peek2(3), TokenType.OPEN_PAREN)) {
+          } else if (tokenMatches(peek(), TokenType.PERIOD) && tokenMatches(peekAt(3), TokenType.OPEN_PAREN)) {
             bodyAllowed = false;
             initializers.add(parseRedirectingConstructorInvocation());
           } else {
@@ -4242,7 +4242,7 @@
     }
     List<Token> tokens = new List.from(commentTokens);
     List<CommentReference> references = parseCommentReferences(tokens);
-    return Comment.createDocumentationComment2(tokens, references);
+    return Comment.createDocumentationCommentWithReferences(tokens, references);
   }
 
   /**
@@ -4696,7 +4696,7 @@
    */
   FunctionTypeAlias parseFunctionTypeAlias(CommentAndMetadata commentAndMetadata, Token keyword) {
     TypeName returnType = null;
-    if (hasReturnTypeInTypeAlias()) {
+    if (hasReturnTypeInTypeAlias) {
       returnType = parseReturnType();
     }
     SimpleIdentifier name = parseSimpleIdentifier();
@@ -5410,7 +5410,7 @@
       return parseReturnType();
     } else if (matchesIdentifier() && !matchesKeyword(Keyword.GET) && !matchesKeyword(Keyword.SET) && !matchesKeyword(Keyword.OPERATOR) && (tokenMatchesIdentifier(peek()) || tokenMatches(peek(), TokenType.LT))) {
       return parseReturnType();
-    } else if (matchesIdentifier() && tokenMatches(peek(), TokenType.PERIOD) && tokenMatchesIdentifier(peek2(2)) && (tokenMatchesIdentifier(peek2(3)) || tokenMatches(peek2(3), TokenType.LT))) {
+    } else if (matchesIdentifier() && tokenMatches(peek(), TokenType.PERIOD) && tokenMatchesIdentifier(peekAt(2)) && (tokenMatchesIdentifier(peekAt(3)) || tokenMatches(peekAt(3), TokenType.LT))) {
       return parseReturnType();
     }
     return null;
@@ -6279,7 +6279,7 @@
 
   /**
    * Return the token that is immediately after the current token. This is equivalent to
-   * [peek].
+   * [peekAt].
    *
    * @return the token that is immediately after the current token
    */
@@ -6292,7 +6292,7 @@
    *          `1` is the next token, etc.
    * @return the token that is the given distance after the current token
    */
-  Token peek2(int distance) {
+  Token peekAt(int distance) {
     Token token = _currentToken;
     for (int i = 0; i < distance; i++) {
       token = token.next;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 10466cb..4d27e6b 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2001,21 +2001,12 @@
    * Build the HTML element for the given source.
    *
    * @param source the source describing the compilation unit
-   * @return the HTML element that was built
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _context.getModificationStamp(source), _context.parseHtmlUnit(source));
-
-  /**
-   * Build the HTML element for the given source.
-   *
-   * @param source the source describing the compilation unit
    * @param modificationStamp the modification time of the source for which an element is being
    *          built
    * @param unit the AST structure representing the HTML
    * @throws AnalysisException if the analysis could not be performed
    */
-  HtmlElementImpl buildHtmlElement2(Source source, int modificationStamp, ht.HtmlUnit unit) {
+  HtmlElementImpl buildHtmlElement(Source source, int modificationStamp, ht.HtmlUnit unit) {
     this._modificationStamp = modificationStamp;
     HtmlElementImpl result = new HtmlElementImpl(_context, source.shortName);
     result.source = source;
@@ -2368,10 +2359,10 @@
     if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) {
       if (node.notOperator == null) {
         // the is case
-        _errorReporter.reportError2(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
+        _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
       } else {
         // the is not case
-        _errorReporter.reportError2(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
+        _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
       }
       return true;
     }
@@ -2382,19 +2373,19 @@
       if (rhsType.isObject || (expression is NullLiteral && rhsNameStr == _NULL_TYPE_NAME)) {
         if (node.notOperator == null) {
           // the is case
-          _errorReporter.reportError2(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
+          _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
         } else {
           // the is not case
-          _errorReporter.reportError2(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
+          _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
         }
         return true;
       } else if (rhsNameStr == _NULL_TYPE_NAME) {
         if (node.notOperator == null) {
           // the is case
-          _errorReporter.reportError2(HintCode.TYPE_CHECK_IS_NULL, node, []);
+          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NULL, node, []);
         } else {
           // the is not case
-          _errorReporter.reportError2(HintCode.TYPE_CHECK_IS_NOT_NULL, node, []);
+          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NOT_NULL, node, []);
         }
         return true;
       }
@@ -2423,7 +2414,7 @@
           displayName = "${displayName}.${constructorElement.displayName}";
         }
       }
-      _errorReporter.reportError2(HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
+      _errorReporter.reportErrorForNode(HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
       return true;
     }
     return false;
@@ -2481,7 +2472,7 @@
       if (parenthesizedExpression.parent is MethodInvocation) {
         MethodInvocation methodInvocation = parenthesizedExpression.parent as MethodInvocation;
         if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name && methodInvocation.argumentList.arguments.isEmpty) {
-          _errorReporter.reportError2(HintCode.DIVISION_OPTIMIZATION, methodInvocation, []);
+          _errorReporter.reportErrorForNode(HintCode.DIVISION_OPTIMIZATION, methodInvocation, []);
           return true;
         }
       }
@@ -2516,7 +2507,7 @@
     // Check the block for a return statement, if not, create the hint
     BlockFunctionBody blockFunctionBody = body as BlockFunctionBody;
     if (!blockFunctionBody.accept(new ExitDetector())) {
-      _errorReporter.reportError2(HintCode.MISSING_RETURN, returnType, [returnTypeType.displayName]);
+      _errorReporter.reportErrorForNode(HintCode.MISSING_RETURN, returnType, [returnTypeType.displayName]);
       return true;
     }
     return false;
@@ -2539,7 +2530,7 @@
     if (equalsOperatorMethodElement != null) {
       PropertyAccessorElement hashCodeElement = classElement.getGetter(_HASHCODE_GETTER_NAME);
       if (hashCodeElement == null) {
-        _errorReporter.reportError2(HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE, node.name, [classElement.displayName]);
+        _errorReporter.reportErrorForNode(HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE, node.name, [classElement.displayName]);
         return true;
       }
     }
@@ -2592,7 +2583,7 @@
           }
           if (overriddenAccessor != null) {
             String memberType = (executableElement as PropertyAccessorElement).isGetter ? _GETTER : _SETTER;
-            _errorReporter.reportError2(HintCode.OVERRIDDING_PRIVATE_MEMBER, node.name, [
+            _errorReporter.reportErrorForNode(HintCode.OVERRIDDING_PRIVATE_MEMBER, node.name, [
                 memberType,
                 executableElement.displayName,
                 classElement.displayName]);
@@ -2601,7 +2592,7 @@
         } else {
           MethodElement overriddenMethod = classElement.getMethod(elementName);
           if (overriddenMethod != null) {
-            _errorReporter.reportError2(HintCode.OVERRIDDING_PRIVATE_MEMBER, node.name, [
+            _errorReporter.reportErrorForNode(HintCode.OVERRIDDING_PRIVATE_MEMBER, node.name, [
                 _METHOD,
                 executableElement.displayName,
                 classElement.displayName]);
@@ -2630,7 +2621,7 @@
     // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to remove the
     // !(x instanceof TypeParameterType) checks.
     if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
-      _errorReporter.reportError2(HintCode.UNNECESSARY_CAST, node, []);
+      _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node, []);
       return true;
     }
     return false;
@@ -2654,7 +2645,7 @@
     MethodInvocation methodInvocation = expression as MethodInvocation;
     if (identical(methodInvocation.staticType, VoidTypeImpl.instance)) {
       SimpleIdentifier methodName = methodInvocation.methodName;
-      _errorReporter.reportError2(HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
+      _errorReporter.reportErrorForNode(HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
       return true;
     }
     return false;
@@ -2719,9 +2710,9 @@
       //      } else
       if (typeNameStr == _DOUBLE_TYPE_NAME && libraryElement != null && libraryElement.isDartCore) {
         if (node.notOperator == null) {
-          _errorReporter.reportError2(HintCode.IS_DOUBLE, node, []);
+          _errorReporter.reportErrorForNode(HintCode.IS_DOUBLE, node, []);
         } else {
-          _errorReporter.reportError2(HintCode.IS_NOT_DOUBLE, node, []);
+          _errorReporter.reportErrorForNode(HintCode.IS_NOT_DOUBLE, node, []);
         }
         return true;
       }
@@ -2760,13 +2751,13 @@
         if (lhsResult != null) {
           if (lhsResult.isTrue && isBarBar) {
             // report error on else block: true || !e!
-            _errorReporter.reportError2(HintCode.DEAD_CODE, node.rightOperand, []);
+            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
             // only visit the LHS:
             safelyVisit(lhsCondition);
             return null;
           } else if (lhsResult.isFalse && isAmpAmp) {
             // report error on if block: false && !e!
-            _errorReporter.reportError2(HintCode.DEAD_CODE, node.rightOperand, []);
+            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
             // only visit the LHS:
             safelyVisit(lhsCondition);
             return null;
@@ -2794,7 +2785,7 @@
         Statement lastStatement = statements[size - 1];
         int offset = nextStatement.offset;
         int length = lastStatement.end - offset;
-        _errorReporter.reportError4(HintCode.DEAD_CODE, offset, length, []);
+        _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
         return null;
       }
     }
@@ -2809,12 +2800,12 @@
       if (result != null) {
         if (result.isTrue) {
           // report error on else block: true ? 1 : !2!
-          _errorReporter.reportError2(HintCode.DEAD_CODE, node.elseExpression, []);
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.elseExpression, []);
           safelyVisit(node.thenExpression);
           return null;
         } else {
           // report error on if block: false ? !1! : 2
-          _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenExpression, []);
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenExpression, []);
           safelyVisit(node.elseExpression);
           return null;
         }
@@ -2833,13 +2824,13 @@
           // report error on else block: if(true) {} else {!}
           Statement elseStatement = node.elseStatement;
           if (elseStatement != null) {
-            _errorReporter.reportError2(HintCode.DEAD_CODE, elseStatement, []);
+            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, elseStatement, []);
             safelyVisit(node.thenStatement);
             return null;
           }
         } else {
           // report error on if block: if (false) {!} else {}
-          _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenStatement, []);
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenStatement, []);
           safelyVisit(node.elseStatement);
           return null;
         }
@@ -2873,7 +2864,7 @@
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = nextCatchClause.offset;
               int length = lastCatchClause.end - offset;
-              _errorReporter.reportError4(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+              _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
               return null;
             }
           }
@@ -2882,7 +2873,7 @@
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = catchClause.offset;
               int length = lastCatchClause.end - offset;
-              _errorReporter.reportError4(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
+              _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
               return null;
             }
           }
@@ -2899,7 +2890,7 @@
           CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
           int offset = nextCatchClause.offset;
           int length = lastCatchClause.end - offset;
-          _errorReporter.reportError4(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+          _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
           return null;
         }
       }
@@ -2915,7 +2906,7 @@
       if (result != null) {
         if (result.isFalse) {
           // report error on if block: while (false) {!}
-          _errorReporter.reportError2(HintCode.DEAD_CODE, node.body, []);
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body, []);
           return null;
         }
       }
@@ -3525,7 +3516,7 @@
    */
   void generateDuplicateImportHints(ErrorReporter errorReporter) {
     for (ImportDirective duplicateImport in _duplicateImports) {
-      errorReporter.reportError2(HintCode.DUPLICATE_IMPORT, duplicateImport.uri, []);
+      errorReporter.reportErrorForNode(HintCode.DUPLICATE_IMPORT, duplicateImport.uri, []);
     }
   }
 
@@ -3547,7 +3538,7 @@
           continue;
         }
       }
-      errorReporter.reportError2(HintCode.UNUSED_IMPORT, unusedImport.uri, []);
+      errorReporter.reportErrorForNode(HintCode.UNUSED_IMPORT, unusedImport.uri, []);
     }
   }
 
@@ -3685,7 +3676,7 @@
       ImportElement importElement = importDirective.element;
       if (importElement != null) {
         NamespaceBuilder builder = new NamespaceBuilder();
-        namespace = builder.createImportNamespace(importElement);
+        namespace = builder.createImportNamespaceForDirective(importElement);
         _namespaceMap[importDirective] = namespace;
       }
     }
@@ -3803,12 +3794,12 @@
     if (isOverride(element)) {
       if (getOverriddenMember(element) == null) {
         if (element is MethodElement) {
-          _errorReporter.reportError2(HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name, []);
+          _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name, []);
         } else if (element is PropertyAccessorElement) {
           if (element.isGetter) {
-            _errorReporter.reportError2(HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, node.name, []);
+            _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, node.name, []);
           } else {
-            _errorReporter.reportError2(HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, node.name, []);
+            _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, node.name, []);
           }
         }
       }
@@ -3896,7 +3887,7 @@
           Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
           if (_context.exists(pubspecSource)) {
             // Files inside the lib directory hierarchy should not reference files outside
-            _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
+            _errorReporter.reportErrorForNode(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
           }
           return true;
         }
@@ -3944,7 +3935,7 @@
       if (StringUtilities.indexOf5(fullName, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F) < 0) {
         // Files outside the lib directory hierarchy should not reference files inside
         // ... use package: url instead
-        _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, uriLiteral, []);
+        _errorReporter.reportErrorForNode(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, uriLiteral, []);
         return true;
       }
     }
@@ -3962,7 +3953,7 @@
   bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
     if (StringUtilities.startsWith3(path, 0, 0x2E, 0x2E, 0x2F) || StringUtilities.indexOf4(path, 0, 0x2F, 0x2E, 0x2E, 0x2F) >= 0) {
       // Package import should not to contain ".."
-      _errorReporter.reportError2(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
+      _errorReporter.reportErrorForNode(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
       return true;
     }
     return false;
@@ -4061,7 +4052,7 @@
     if (matcher.find()) {
       int offset = commentToken.offset + matcher.start() + matcher.group(1).length;
       int length = matcher.group(2).length;
-      _errorReporter.reportError4(TodoCode.TODO, offset, length, [matcher.group(2)]);
+      _errorReporter.reportErrorForOffset(TodoCode.TODO, offset, length, [matcher.group(2)]);
     }
   }
 }
@@ -5392,9 +5383,9 @@
         MethodElement propagatedMethod = lookUpMethod(leftHandSide, propagatedType, methodName);
         node.propagatedElement = propagatedMethod;
         if (shouldReportMissingMember(staticType, staticMethod)) {
-          _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
         } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-          _resolver.reportErrorProxyConditionalAnalysisError3(propagatedType.element, HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayName]);
         }
       }
     }
@@ -5414,9 +5405,9 @@
         MethodElement propagatedMethod = lookUpMethod(leftOperand, propagatedType, methodName);
         node.propagatedElement = propagatedMethod;
         if (shouldReportMissingMember(staticType, staticMethod)) {
-          _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
         } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-          _resolver.reportErrorProxyConditionalAnalysisError3(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
         }
       }
     }
@@ -5595,13 +5586,13 @@
   }
 
   Object visitExportDirective(ExportDirective node) {
-    Element element = node.element;
-    if (element is ExportElement) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
       // The element is null when the URI is invalid
       // TODO(brianwilkerson) Figure out whether the element can ever be something other than an
       // ExportElement
-      resolveCombinators(element.exportedLibrary, node.combinators);
-      setMetadata(element, node);
+      resolveCombinators(exportElement.exportedLibrary, node.combinators);
+      setMetadata(exportElement, node);
     }
     return null;
   }
@@ -5833,7 +5824,7 @@
         ClassElement enclosingClass = _resolver.enclosingClass;
         targetTypeName = enclosingClass.displayName;
         ErrorCode proxyErrorCode = (generatedWithTypePropagation ? HintCode.UNDEFINED_METHOD : StaticTypeWarningCode.UNDEFINED_METHOD) as ErrorCode;
-        _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
+        _resolver.reportProxyConditionalErrorForNode(_resolver.enclosingClass, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
       } else {
         // ignore Function "call"
         // (if we are about to create a hint using type propagation, then we can use type
@@ -5855,7 +5846,7 @@
         }
         targetTypeName = targetType == null ? null : targetType.displayName;
         ErrorCode proxyErrorCode = (generatedWithTypePropagation ? HintCode.UNDEFINED_METHOD : StaticTypeWarningCode.UNDEFINED_METHOD) as ErrorCode;
-        _resolver.reportErrorProxyConditionalAnalysisError(targetType.element, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
+        _resolver.reportProxyConditionalErrorForNode(targetType.element, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
       }
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
       // Generate the type name.
@@ -5887,9 +5878,9 @@
     MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
     node.propagatedElement = propagatedMethod;
     if (shouldReportMissingMember(staticType, staticMethod)) {
-      _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
+      _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
     } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-      _resolver.reportErrorProxyConditionalAnalysisError3(propagatedType.element, HintCode.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.displayName]);
+      _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.displayName]);
     }
     return null;
   }
@@ -5964,9 +5955,9 @@
       MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
       node.propagatedElement = propagatedMethod;
       if (shouldReportMissingMember(staticType, staticMethod)) {
-        _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
+        _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
       } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-        _resolver.reportErrorProxyConditionalAnalysisError3(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
+        _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
       }
     }
     return null;
@@ -6056,7 +6047,7 @@
         Annotation annotation = node.parent as Annotation;
         _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
       } else {
-        _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
+        _resolver.reportProxyConditionalErrorForNode(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
     }
     node.staticElement = element;
@@ -6249,13 +6240,13 @@
       sc.Token rightBracket = node.rightBracket;
       ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_OPERATOR : HintCode.UNDEFINED_OPERATOR) as ErrorCode;
       if (leftBracket == null || rightBracket == null) {
-        _resolver.reportErrorProxyConditionalAnalysisError(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, node, [
+        _resolver.reportProxyConditionalErrorForNode(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, node, [
             methodName,
             shouldReportMissingMember_static ? staticType.displayName : propagatedType.displayName]);
       } else {
         int offset = leftBracket.offset;
         int length = rightBracket.offset - offset + 1;
-        _resolver.reportErrorProxyConditionalAnalysisError2(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, offset, length, [
+        _resolver.reportProxyConditionalErrorForOffset(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, offset, length, [
             methodName,
             shouldReportMissingMember_static ? staticType.displayName : propagatedType.displayName]);
       }
@@ -6649,7 +6640,7 @@
     if (labelNode == null) {
       if (labelScope == null) {
       } else {
-        labelElement = labelScope.lookup2(LabelScope.EMPTY_LABEL) as LabelElementImpl;
+        labelElement = labelScope.lookup(LabelScope.EMPTY_LABEL) as LabelElementImpl;
         if (labelElement == null) {
         }
         //
@@ -6662,7 +6653,7 @@
       if (labelScope == null) {
         _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
       } else {
-        labelElement = labelScope.lookup(labelNode) as LabelElementImpl;
+        labelElement = labelScope.lookup(labelNode.name) as LabelElementImpl;
         if (labelElement == null) {
           _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
         } else {
@@ -7123,7 +7114,7 @@
       //
       return;
     }
-    Namespace namespace = new NamespaceBuilder().createExportNamespace2(library);
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(library);
     for (Combinator combinator in combinators) {
       NodeList<SimpleIdentifier> names;
       if (combinator is HideCombinator) {
@@ -7318,29 +7309,29 @@
         if (propertyName.inSetterContext()) {
           if (isStaticProperty) {
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticWarningCode.UNDEFINED_SETTER : HintCode.UNDEFINED_SETTER) as ErrorCode;
-            _resolver.reportErrorProxyConditionalAnalysisError(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
+            _resolver.reportProxyConditionalErrorForNode(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
                 propertyName.name,
                 staticOrPropagatedEnclosingElt.displayName]);
           } else {
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_SETTER : HintCode.UNDEFINED_SETTER) as ErrorCode;
-            _resolver.reportErrorProxyConditionalAnalysisError(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
+            _resolver.reportProxyConditionalErrorForNode(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
                 propertyName.name,
                 staticOrPropagatedEnclosingElt.displayName]);
           }
         } else if (propertyName.inGetterContext()) {
           if (isStaticProperty) {
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticWarningCode.UNDEFINED_GETTER : HintCode.UNDEFINED_GETTER) as ErrorCode;
-            _resolver.reportErrorProxyConditionalAnalysisError(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
+            _resolver.reportProxyConditionalErrorForNode(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
                 propertyName.name,
                 staticOrPropagatedEnclosingElt.displayName]);
           } else {
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_GETTER : HintCode.UNDEFINED_GETTER) as ErrorCode;
-            _resolver.reportErrorProxyConditionalAnalysisError(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
+            _resolver.reportProxyConditionalErrorForNode(staticOrPropagatedEnclosingElt, errorCode, propertyName, [
                 propertyName.name,
                 staticOrPropagatedEnclosingElt.displayName]);
           }
         } else {
-          _resolver.reportErrorProxyConditionalAnalysisError(staticOrPropagatedEnclosingElt, StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
+          _resolver.reportProxyConditionalErrorForNode(staticOrPropagatedEnclosingElt, StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
         }
       }
     }
@@ -8754,7 +8745,7 @@
     _directiveUris[directive] = uriContent;
     uriContent = Uri.encodeFull(uriContent);
     if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
-      _libraryElement.hasExtUri2 = true;
+      _libraryElement.hasExtUri = true;
       return null;
     }
     try {
@@ -9420,7 +9411,7 @@
       libraryElement.imports = new List.from(imports);
       libraryElement.exports = new List.from(exports);
       if (libraryElement.entryPoint == null) {
-        Namespace namespace = new NamespaceBuilder().createExportNamespace2(libraryElement);
+        Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(libraryElement);
         Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME);
         if (element is FunctionElement) {
           libraryElement.entryPoint = element;
@@ -10070,7 +10061,7 @@
 
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
-    override(node.expression, node.type.type);
+    overrideExpression(node.expression, node.type.type);
     return null;
   }
 
@@ -10247,8 +10238,8 @@
     }
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
-    bool thenIsAbrupt = isAbruptTermination(thenExpression);
-    bool elseIsAbrupt = isAbruptTermination(elseExpression);
+    bool thenIsAbrupt = isAbruptTerminationExpression(thenExpression);
+    bool elseIsAbrupt = isAbruptTerminationExpression(elseExpression);
     if (elseIsAbrupt && !thenIsAbrupt) {
       propagateTrueState(condition);
       propagateState(thenExpression);
@@ -10432,8 +10423,8 @@
     }
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
-    bool thenIsAbrupt = isAbruptTermination2(thenStatement);
-    bool elseIsAbrupt = isAbruptTermination2(elseStatement);
+    bool thenIsAbrupt = isAbruptTerminationStatement(thenStatement);
+    bool elseIsAbrupt = isAbruptTerminationStatement(elseStatement);
     if (elseIsAbrupt && !thenIsAbrupt) {
       propagateTrueState(condition);
       if (thenOverrides != null) {
@@ -10681,14 +10672,14 @@
    *          might be overridden
    * @param potentialType the potential type of the elements
    */
-  void override(Expression expression, Type2 potentialType) {
+  void overrideExpression(Expression expression, Type2 potentialType) {
     VariableElement element = getOverridableStaticElement(expression);
     if (element != null) {
-      override2(element, potentialType);
+      overrideVariable(element, potentialType);
     }
     element = getOverridablePropagatedElement(expression);
     if (element != null) {
-      override2(element, potentialType);
+      overrideVariable(element, potentialType);
     }
   }
 
@@ -10700,7 +10691,7 @@
    * @param element the element whose type might be overridden
    * @param potentialType the potential type of the element
    */
-  void override2(VariableElement element, Type2 potentialType) {
+  void overrideVariable(VariableElement element, Type2 potentialType) {
     if (potentialType == null || potentialType.isBottom) {
       return;
     }
@@ -10724,7 +10715,7 @@
    * @param node the node specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportErrorProxyConditionalAnalysisError(Element enclosingElement, ErrorCode errorCode, AstNode node, List<Object> arguments) {
+  void reportProxyConditionalErrorForNode(Element enclosingElement, ErrorCode errorCode, AstNode node, List<Object> arguments) {
     _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, node.offset, node.length, errorCode, arguments)));
   }
 
@@ -10737,7 +10728,7 @@
    * @param length the length of the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportErrorProxyConditionalAnalysisError2(Element enclosingElement, ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void reportProxyConditionalErrorForOffset(Element enclosingElement, ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, offset, length, errorCode, arguments)));
   }
 
@@ -10749,7 +10740,7 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportErrorProxyConditionalAnalysisError3(Element enclosingElement, ErrorCode errorCode, sc.Token token, List<Object> arguments) {
+  void reportErrorProxyConditionalAnalysisError(Element enclosingElement, ErrorCode errorCode, sc.Token token, List<Object> arguments) {
     _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode, arguments)));
   }
 
@@ -10772,14 +10763,14 @@
           LocalVariableElement loopElement = loopVariable.element;
           if (loopElement != null) {
             Type2 iteratorElementType = getIteratorElementType(iterator);
-            override2(loopElement, iteratorElementType);
+            overrideVariable(loopElement, iteratorElementType);
             recordPropagatedType(loopVariable.identifier, iteratorElementType);
           }
         } else if (identifier != null && iterator != null) {
           Element identifierElement = identifier.staticElement;
           if (identifierElement is VariableElement) {
             Type2 iteratorElementType = getIteratorElementType(iterator);
-            override2(identifierElement, iteratorElementType);
+            overrideVariable(identifierElement, iteratorElementType);
             recordPropagatedType(identifier, iteratorElementType);
           }
         }
@@ -10941,7 +10932,7 @@
    * @param expression the expression being tested
    * @return `true` if the given expression terminates abruptly
    */
-  bool isAbruptTermination(Expression expression) {
+  bool isAbruptTerminationExpression(Expression expression) {
     // TODO(brianwilkerson) This needs to be significantly improved. Ideally we would eventually
     // turn this into a method on Expression that returns a termination indication (normal, abrupt
     // with no exception, abrupt with an exception).
@@ -10958,21 +10949,21 @@
    * @param statement the statement being tested
    * @return `true` if the given statement terminates abruptly
    */
-  bool isAbruptTermination2(Statement statement) {
+  bool isAbruptTerminationStatement(Statement statement) {
     // TODO(brianwilkerson) This needs to be significantly improved. Ideally we would eventually
     // turn this into a method on Statement that returns a termination indication (normal, abrupt
     // with no exception, abrupt with an exception).
     if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
       return true;
     } else if (statement is ExpressionStatement) {
-      return isAbruptTermination(statement.expression);
+      return isAbruptTerminationExpression(statement.expression);
     } else if (statement is Block) {
       NodeList<Statement> statements = statement.statements;
       int size = statements.length;
       if (size == 0) {
         return false;
       }
-      return isAbruptTermination2(statements[size - 1]);
+      return isAbruptTerminationStatement(statements[size - 1]);
     }
     return false;
   }
@@ -11083,7 +11074,7 @@
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
       if (is2.notOperator != null) {
-        override(is2.expression, is2.type.type);
+        overrideExpression(is2.expression, is2.type.type);
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
@@ -11120,7 +11111,7 @@
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
       if (is2.notOperator == null) {
-        override(is2.expression, is2.type.type);
+        overrideExpression(is2.expression, is2.type.type);
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
@@ -11987,7 +11978,7 @@
         }
         overrideType = propagatedType;
       }
-      _resolver.override(node.leftHandSide, overrideType);
+      _resolver.overrideExpression(node.leftHandSide, overrideType);
     } else {
       ExecutableElement staticMethodElement = node.staticElement;
       Type2 staticType = computeStaticReturnType(staticMethodElement);
@@ -12963,7 +12954,7 @@
       recordPropagatedType(name, rightType);
       VariableElement element = name.staticElement as VariableElement;
       if (element != null) {
-        _resolver.override2(element, rightType);
+        _resolver.overrideVariable(element, rightType);
       }
     }
     return null;
@@ -14172,7 +14163,7 @@
    * @param library the library containing the definitions of the core types
    */
   void initializeFrom(LibraryElement library) {
-    Namespace namespace = new NamespaceBuilder().createPublicNamespace(library);
+    Namespace namespace = new NamespaceBuilder().createPublicNamespaceForLibrary(library);
     _boolType = getType(namespace, "bool");
     _bottomType = BottomTypeImpl.instance;
     _deprecatedType = getType(namespace, "Deprecated");
@@ -14321,7 +14312,7 @@
         }
       }
       classElement.supertype = superclassType;
-      classElement.hasReferenceToSuper2 = _hasReferenceToSuper;
+      classElement.hasReferenceToSuper = _hasReferenceToSuper;
     }
     resolve(classElement, node.withClause, node.implementsClause);
     return null;
@@ -15483,7 +15474,7 @@
     }
   }
 
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element element = localLookup(name, referencingLibrary);
     if (element != null) {
       return element;
@@ -15497,7 +15488,7 @@
       }
     }
     // Check enclosing scope.
-    return enclosingScope.lookup3(identifier, name, referencingLibrary);
+    return enclosingScope.internalLookup(identifier, name, referencingLibrary);
   }
 }
 
@@ -15651,20 +15642,11 @@
    * @param targetLabel the label being looked up
    * @return the label element corresponding to the given label
    */
-  LabelElement lookup(SimpleIdentifier targetLabel) => lookup2(targetLabel.name);
-
-  /**
-   * Return the label element corresponding to the given label, or `null` if the given label
-   * is not defined in this scope.
-   *
-   * @param targetLabel the label being looked up
-   * @return the label element corresponding to the given label
-   */
-  LabelElement lookup2(String targetLabel) {
+  LabelElement lookup(String targetLabel) {
     if (_label == targetLabel) {
       return _element;
     } else if (_outerScope != null) {
-      return _outerScope.lookup2(targetLabel);
+      return _outerScope.lookup(targetLabel);
     } else {
       return null;
     }
@@ -15710,7 +15692,7 @@
     }
   }
 
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element foundElement = localLookup(name, referencingLibrary);
     if (foundElement != null) {
       return foundElement;
@@ -15739,7 +15721,7 @@
       return foundElement;
     }
     if (foundElement != null) {
-      defineWithoutChecking2(name, foundElement);
+      defineNameWithoutChecking(name, foundElement);
     }
     return foundElement;
   }
@@ -15757,7 +15739,7 @@
     int count = imports.length;
     _importedNamespaces = new List<Namespace>(count);
     for (int i = 0; i < count; i++) {
-      _importedNamespaces[i] = builder.createImportNamespace(imports[i]);
+      _importedNamespaces[i] = builder.createImportNamespaceForDirective(imports[i]);
     }
   }
 
@@ -15946,7 +15928,7 @@
    * @param element the export element whose export namespace is to be created
    * @return the export namespace that was created
    */
-  Namespace createExportNamespace(ExportElement element) {
+  Namespace createExportNamespaceForDirective(ExportElement element) {
     LibraryElement exportedLibrary = element.exportedLibrary;
     if (exportedLibrary == null) {
       //
@@ -15955,7 +15937,7 @@
       return Namespace.EMPTY;
     }
     Map<String, Element> definedNames = createExportMapping(exportedLibrary, new Set<LibraryElement>());
-    definedNames = apply(definedNames, element.combinators);
+    definedNames = applyCombinators(definedNames, element.combinators);
     return new Namespace(definedNames);
   }
 
@@ -15965,7 +15947,7 @@
    * @param library the library whose export namespace is to be created
    * @return the export namespace that was created
    */
-  Namespace createExportNamespace2(LibraryElement library) => new Namespace(createExportMapping(library, new Set<LibraryElement>()));
+  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(createExportMapping(library, new Set<LibraryElement>()));
 
   /**
    * Create a namespace representing the import namespace of the given library.
@@ -15973,7 +15955,7 @@
    * @param library the library whose import namespace is to be created
    * @return the import namespace that was created
    */
-  Namespace createImportNamespace(ImportElement element) {
+  Namespace createImportNamespaceForDirective(ImportElement element) {
     LibraryElement importedLibrary = element.importedLibrary;
     if (importedLibrary == null) {
       //
@@ -15982,8 +15964,8 @@
       return Namespace.EMPTY;
     }
     Map<String, Element> definedNames = createExportMapping(importedLibrary, new Set<LibraryElement>());
-    definedNames = apply(definedNames, element.combinators);
-    definedNames = apply2(definedNames, element.prefix);
+    definedNames = applyCombinators(definedNames, element.combinators);
+    definedNames = applyPrefix(definedNames, element.prefix);
     return new Namespace(definedNames);
   }
 
@@ -15993,7 +15975,7 @@
    * @param library the library whose public namespace is to be created
    * @return the public namespace that was created
    */
-  Namespace createPublicNamespace(LibraryElement library) {
+  Namespace createPublicNamespaceForLibrary(LibraryElement library) {
     Map<String, Element> definedNames = new Map<String, Element>();
     addPublicNames(definedNames, library.definingCompilationUnit);
     for (CompilationUnitElement compilationUnit in library.parts) {
@@ -16008,7 +15990,7 @@
    * @param definedNames the mapping table to which the names in the given namespace are to be added
    * @param namespace the namespace containing the names to be added to this namespace
    */
-  void addAll(Map<String, Element> definedNames, Map<String, Element> newNames) {
+  void addAllFromMap(Map<String, Element> definedNames, Map<String, Element> newNames) {
     for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) {
       definedNames[entry.getKey()] = entry.getValue();
     }
@@ -16020,9 +16002,9 @@
    * @param definedNames the mapping table to which the names in the given namespace are to be added
    * @param namespace the namespace containing the names to be added to this namespace
    */
-  void addAll2(Map<String, Element> definedNames, Namespace namespace) {
+  void addAllFromNamespace(Map<String, Element> definedNames, Namespace namespace) {
     if (namespace != null) {
-      addAll(definedNames, namespace.definedNames);
+      addAllFromMap(definedNames, namespace.definedNames);
     }
   }
 
@@ -16068,7 +16050,7 @@
    * @param definedNames the mapping table to which the namespace operations are to be applied
    * @param combinators the combinators to be applied
    */
-  Map<String, Element> apply(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
+  Map<String, Element> applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
       if (combinator is HideElementCombinator) {
         hide(definedNames, combinator.hiddenNames);
@@ -16088,7 +16070,7 @@
    * @param definedNames the names that were defined before this operation
    * @param prefixElement the element defining the prefix to be added to the names
    */
-  Map<String, Element> apply2(Map<String, Element> definedNames, PrefixElement prefixElement) {
+  Map<String, Element> applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
     if (prefixElement != null) {
       String prefix = prefixElement.name;
       Map<String, Element> newNames = new Map<String, Element>();
@@ -16121,11 +16103,11 @@
           // The exported library will be null if the URI does not reference a valid library.
           //
           Map<String, Element> exportedNames = createExportMapping(exportedLibrary, visitedElements);
-          exportedNames = apply(exportedNames, element.combinators);
-          addAll(definedNames, exportedNames);
+          exportedNames = applyCombinators(exportedNames, element.combinators);
+          addAllFromMap(definedNames, exportedNames);
         }
       }
-      addAll2(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
+      addAllFromNamespace(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
       return definedNames;
     } finally {
       visitedElements.remove(library);
@@ -16246,7 +16228,18 @@
    *          implement library-level privacy
    * @return the element with which the given identifier is associated
    */
-  Element lookup(Identifier identifier, LibraryElement referencingLibrary) => lookup3(identifier, identifier.name, referencingLibrary);
+  Element lookup(Identifier identifier, LibraryElement referencingLibrary) => internalLookup(identifier, identifier.name, referencingLibrary);
+
+  /**
+   * Add the given element to this scope without checking for duplication or hiding.
+   *
+   * @param name the name of the element to be added
+   * @param element the element to be added to this scope
+   */
+  void defineNameWithoutChecking(String name, Element element) {
+    _definedNames[name] = element;
+    _hasName = true;
+  }
 
   /**
    * Add the given element to this scope without checking for duplication or hiding.
@@ -16259,17 +16252,6 @@
   }
 
   /**
-   * Add the given element to this scope without checking for duplication or hiding.
-   *
-   * @param name the name of the element to be added
-   * @param element the element to be added to this scope
-   */
-  void defineWithoutChecking2(String name, Element element) {
-    _definedNames[name] = element;
-    _hasName = true;
-  }
-
-  /**
    * Return the error code to be used when reporting that a name being defined locally conflicts
    * with another element of the same name in the local scope.
    *
@@ -16312,6 +16294,19 @@
 
   /**
    * Return the element with which the given name is associated, or `null` if the name is not
+   * defined within this scope.
+   *
+   * @param identifier the identifier node to lookup element for, used to report correct kind of a
+   *          problem and associate problem with
+   * @param name the name associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given name is associated
+   */
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary);
+
+  /**
+   * Return the element with which the given name is associated, or `null` if the name is not
    * defined within this scope. This method only returns elements that are directly defined within
    * this scope, not elements that are defined in an enclosing scope.
    *
@@ -16328,19 +16323,6 @@
   }
 
   /**
-   * Return the element with which the given name is associated, or `null` if the name is not
-   * defined within this scope.
-   *
-   * @param identifier the identifier node to lookup element for, used to report correct kind of a
-   *          problem and associate problem with
-   * @param name the name associated with the element to be returned
-   * @param referencingLibrary the library that contains the reference to the name, used to
-   *          implement library-level privacy
-   * @return the element with which the given name is associated
-   */
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary);
-
-  /**
    * Return the name that will be used to look up the given element.
    *
    * @param element the element whose look-up name is to be returned
@@ -16514,13 +16496,13 @@
       ConstructorElement constructorElement = element;
       // should 'const' constructor
       if (!constructorElement.isConst) {
-        _errorReporter.reportError2(CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node, []);
         return null;
       }
       // should have arguments
       ArgumentList argumentList = node.arguments;
       if (argumentList == null) {
-        _errorReporter.reportError2(CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node, []);
         return null;
       }
       // arguments should be constants
@@ -16593,7 +16575,7 @@
     }
     if (reportEqualKeys) {
       for (Expression key in invalidKeys) {
-        _errorReporter.reportError2(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, []);
+        _errorReporter.reportErrorForNode(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, []);
       }
     }
     return null;
@@ -16644,9 +16626,9 @@
       for (ErrorResult_ErrorData data in result.errorData) {
         ErrorCode dataErrorCode = data.errorCode;
         if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
-          _errorReporter.reportError2(dataErrorCode, data.node, []);
+          _errorReporter.reportErrorForNode(dataErrorCode, data.node, []);
         } else {
-          _errorReporter.reportError2(errorCode, data.node, []);
+          _errorReporter.reportErrorForNode(errorCode, data.node, []);
         }
       }
     }
@@ -16836,6 +16818,11 @@
   InterfaceType _boolType;
 
   /**
+   * The type representing the type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
    * The object providing access to the types defined by the language.
    */
   TypeProvider _typeProvider;
@@ -16997,7 +16984,7 @@
     this._errorReporter = errorReporter;
     this._currentLibrary = currentLibrary;
     this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary;
-    this._hasExtUri = currentLibrary.hasExtUri();
+    this._hasExtUri = currentLibrary.hasExtUri;
     this._typeProvider = typeProvider;
     this._inheritanceManager = inheritanceManager;
     _isEnclosingConstructorConst = false;
@@ -17008,21 +16995,17 @@
     _isInConstructorInitializer = false;
     _isInStaticMethod = false;
     _boolType = typeProvider.boolType;
+    _intType = typeProvider.intType;
     _dynamicType = typeProvider.dynamicType;
     _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
         typeProvider.nullType,
         typeProvider.numType,
-        typeProvider.intType,
+        _intType,
         typeProvider.doubleType,
         _boolType,
         typeProvider.stringType];
   }
 
-  Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    checkForArgumentDefinitionTestNonParameter(node);
-    return super.visitArgumentDefinitionTest(node);
-  }
-
   Object visitArgumentList(ArgumentList node) {
     checkForArgumentTypesNotAssignableInList(node);
     return super.visitArgumentList(node);
@@ -17071,7 +17054,7 @@
     if (labelNode != null) {
       Element labelElement = labelNode.staticElement;
       if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
-        _errorReporter.reportError2(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
+        _errorReporter.reportErrorForNode(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
       }
     }
     return null;
@@ -17107,6 +17090,10 @@
           checkForNonAbstractClassInheritsAbstractMember(node);
           checkForInconsistentMethodInheritance();
           checkForRecursiveInterfaceInheritance(_enclosingClass);
+          checkForConflictingGetterAndMethod();
+          checkForConflictingInstanceGetterAndSuperclassMember();
+          checkImplementsSuperClass(node);
+          checkImplementsFunctionWithoutCall(node);
         }
       }
       // initialize initialFieldElementsMap
@@ -17122,10 +17109,7 @@
       }
       checkForFinalNotInitializedInClass(node);
       checkForDuplicateDefinitionInheritance();
-      checkForConflictingGetterAndMethod();
-      checkForConflictingInstanceGetterAndSuperclassMember();
-      checkImplementsSuperClass(node);
-      checkImplementsFunctionWithoutCall(node);
+      checkForConflictingInstanceMethodSetter(node);
       return super.visitClassDeclaration(node);
     } finally {
       _isInNativeClass = false;
@@ -17203,7 +17187,7 @@
     if (labelNode != null) {
       Element labelElement = labelNode.staticElement;
       if (labelElement is LabelElementImpl && labelElement.isOnSwitchStatement) {
-        _errorReporter.reportError2(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
+        _errorReporter.reportErrorForNode(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
       }
     }
     return null;
@@ -17221,9 +17205,12 @@
   }
 
   Object visitExportDirective(ExportDirective node) {
-    checkForAmbiguousExport(node);
-    checkForExportDuplicateLibraryName(node);
-    checkForExportInternalLibrary(node);
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      checkForAmbiguousExport(node, exportElement);
+      checkForExportDuplicateLibraryName(node, exportElement);
+      checkForExportInternalLibrary(node, exportElement);
+    }
     return super.visitExportDirective(node);
   }
 
@@ -17235,14 +17222,14 @@
   }
 
   Object visitFieldDeclaration(FieldDeclaration node) {
-    if (!node.isStatic) {
-      VariableDeclarationList variables = node.fields;
-      if (variables.isConst) {
-        _errorReporter.reportError5(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
-      }
-    }
     _isInStaticVariableDeclaration = node.isStatic;
     _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
+    if (_isInInstanceVariableDeclaration) {
+      VariableDeclarationList variables = node.fields;
+      if (variables.isConst) {
+        _errorReporter.reportErrorForToken(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
+      }
+    }
     try {
       checkForAllInvalidOverrideErrorCodesForField(node);
       return super.visitFieldDeclaration(node);
@@ -17306,7 +17293,7 @@
     Expression functionExpression = node.function;
     Type2 expressionType = functionExpression.staticType;
     if (!isFunctionType(expressionType)) {
-      _errorReporter.reportError2(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
     }
     return super.visitFunctionExpressionInvocation(node);
   }
@@ -17334,8 +17321,11 @@
   }
 
   Object visitImportDirective(ImportDirective node) {
-    checkForImportDuplicateLibraryName(node);
-    checkForImportInternalLibrary(node);
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      checkForImportDuplicateLibraryName(node, importElement);
+      checkForImportInternalLibrary(node, importElement);
+    }
     return super.visitImportDirective(node);
   }
 
@@ -17422,8 +17412,6 @@
         checkForOptionalParameterInOperator(node);
         checkForWrongNumberOfParametersForOperator(node);
         checkForNonVoidReturnTypeForOperator(node);
-      } else {
-        checkForConflictingInstanceMethodSetter(node);
       }
       checkForConcreteClassWithAbstractMember(node);
       checkForAllInvalidOverrideErrorCodesForMethod(node);
@@ -17450,7 +17438,7 @@
   Object visitNativeClause(NativeClause node) {
     // TODO(brianwilkerson) Figure out the right rule for when 'native' is allowed.
     if (!_isInSystemLibrary) {
-      _errorReporter.reportError2(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
+      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
     }
     return super.visitNativeClause(node);
   }
@@ -17630,7 +17618,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
     return true;
   }
 
@@ -17668,12 +17656,12 @@
           fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
         } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
           if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportError2(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
+            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
         } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
           if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
         }
@@ -17696,14 +17684,14 @@
             fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
           } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
             if (fieldElement.isFinal || fieldElement.isConst) {
-              _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
+              _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
               foundError = true;
             }
           } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
-            _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
             foundError = true;
           } else if (identical(state, INIT_STATE.INIT_IN_INITIALIZERS)) {
-            _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
             foundError = true;
           }
         }
@@ -17714,10 +17702,10 @@
       if (identical(entry.getValue(), INIT_STATE.NOT_INIT)) {
         FieldElement fieldElement = entry.getKey();
         if (fieldElement.isConst) {
-          _errorReporter.reportError2(CompileTimeErrorCode.CONST_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
           foundError = true;
         } else if (fieldElement.isFinal) {
-          _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
+          _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
           foundError = true;
         }
       }
@@ -17777,7 +17765,7 @@
             }
             // instance vs. static
             if (fieldElt.isStatic) {
-              _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
                   executableElementName,
                   fieldElt.enclosingElement.displayName]);
               return true;
@@ -17796,7 +17784,7 @@
             }
             // instance vs. static
             if (methodElement.isStatic) {
-              _errorReporter.reportError2(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
                   executableElementName,
                   methodElement.enclosingElement.displayName]);
               return true;
@@ -17825,13 +17813,13 @@
     Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes;
     // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and CTEC.INVALID_OVERRIDE_NAMED
     if (overridingNormalPT.length > overriddenNormalPT.length) {
-      _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
+      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
           overriddenNormalPT.length,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
     if (overridingNormalPT.length + overridingPositionalPT.length < overriddenPositionalPT.length + overriddenNormalPT.length) {
-      _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
+      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
           overriddenPositionalPT.length + overriddenNormalPT.length,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
@@ -17845,7 +17833,7 @@
       if (!overridingParameterNameSet.contains(overriddenParamName)) {
         // The overridden method expected the overriding method to have overridingParamName,
         // but it does not.
-        _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
+        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
             overriddenParamName,
             overriddenExecutable.enclosingElement.displayName]);
         return true;
@@ -17853,7 +17841,7 @@
     }
     // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
     if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportError2(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
+      _errorReporter.reportErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
           overridingFTReturnType.displayName,
           overriddenFTReturnType.displayName,
           overriddenExecutable.enclosingElement.displayName]);
@@ -17866,7 +17854,7 @@
     int parameterIndex = 0;
     for (int i = 0; i < overridingNormalPT.length; i++) {
       if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportError2(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+        _errorReporter.reportErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
             overridingNormalPT[i].displayName,
             overriddenNormalPT[i].displayName,
             overriddenExecutable.enclosingElement.displayName]);
@@ -17877,7 +17865,7 @@
     // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
     for (int i = 0; i < overriddenPositionalPT.length; i++) {
       if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
-        _errorReporter.reportError2(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
             overridingPositionalPT[i].displayName,
             overriddenPositionalPT[i].displayName,
             overriddenExecutable.enclosingElement.displayName]);
@@ -17908,7 +17896,7 @@
           }
         }
         if (parameterToSelect != null) {
-          _errorReporter.reportError2(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
+          _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
               overridingType.displayName,
               overriddenNamedPTEntry.getValue().displayName,
               overriddenExecutable.enclosingElement.displayName]);
@@ -17965,7 +17953,7 @@
                 break;
               }
               if (!result.equalValues(_typeProvider, overriddenResult)) {
-                _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [
+                _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [
                     overriddenExecutable.enclosingElement.displayName,
                     overriddenExecutable.displayName,
                     parameterName]);
@@ -17989,7 +17977,7 @@
             continue;
           }
           if (!result.equalValues(_typeProvider, overriddenResult)) {
-            _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [
+            _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [
                 overriddenExecutable.enclosingElement.displayName,
                 overriddenExecutable.displayName]);
             foundError = true;
@@ -18160,7 +18148,7 @@
           constructorStrName += ".${redirectedConstructor.name.name}";
         }
         ErrorCode errorCode = (node.constKeyword != null ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR) as ErrorCode;
-        _errorReporter.reportError2(errorCode, redirectedConstructor, [constructorStrName, redirectedType.displayName]);
+        _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [constructorStrName, redirectedType.displayName]);
         return true;
       }
       return false;
@@ -18173,14 +18161,14 @@
     FunctionType constructorType = node.element.type;
     Type2 constructorReturnType = constructorType.returnType;
     if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
-      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
       return true;
     }
     //
     // Check parameters
     //
     if (!redirectedType.isSubtypeOf(constructorType)) {
-      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedConstructor, [redirectedType, constructorType]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedConstructor, [redirectedType, constructorType]);
       return true;
     }
     return false;
@@ -18213,7 +18201,7 @@
       if (returnExpression == null) {
         return false;
       }
-      _errorReporter.reportError2(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
       return true;
     }
     // RETURN_WITHOUT_VALUE
@@ -18221,7 +18209,7 @@
       if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
         return false;
       }
-      _errorReporter.reportError2(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
+      _errorReporter.reportErrorForNode(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
       return true;
     }
     // RETURN_OF_INVALID_TYPE
@@ -18233,29 +18221,26 @@
    * already exported by other export directive.
    *
    * @param node the export directive node to report problem on
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
    */
-  bool checkForAmbiguousExport(ExportDirective node) {
-    // prepare ExportElement
-    if (node.element is! ExportElement) {
-      return false;
-    }
-    ExportElement exportElement = node.element as ExportElement;
+  bool checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
     // prepare exported library
     LibraryElement exportedLibrary = exportElement.exportedLibrary;
     if (exportedLibrary == null) {
       return false;
     }
     // check exported names
-    Namespace namespace = new NamespaceBuilder().createExportNamespace(exportElement);
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
     Map<String, Element> definedNames = namespace.definedNames;
     for (MapEntry<String, Element> definedEntry in getMapEntrySet(definedNames)) {
       String name = definedEntry.getKey();
       Element element = definedEntry.getValue();
       Element prevElement = _exportedElements[name];
       if (element != null && prevElement != null && prevElement != element) {
-        _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
             name,
             prevElement.library.definingCompilationUnit.displayName,
             element.library.definingCompilationUnit.displayName]);
@@ -18268,23 +18253,6 @@
   }
 
   /**
-   * This verifies that the passed argument definition test identifier is a parameter.
-   *
-   * @param node the [ArgumentDefinitionTest] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER
-   */
-  bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) {
-    SimpleIdentifier identifier = node.identifier;
-    Element element = identifier.staticElement;
-    if (element != null && element is! ParameterElement) {
-      _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER, identifier, [identifier.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
    * This verifies that the passed expression can be assigned to its corresponding parameters.
    *
    * @param expression the expression to evaluate
@@ -18306,7 +18274,7 @@
     if (actualStaticType.isAssignableTo(expectedStaticType)) {
       return false;
     }
-    _errorReporter.reportError2(errorCode, expression, [
+    _errorReporter.reportErrorForNode(errorCode, expression, [
         actualStaticType.displayName,
         expectedStaticType.displayName]);
     return true;
@@ -18386,17 +18354,17 @@
     if (element is VariableElement) {
       VariableElement variable = element as VariableElement;
       if (variable.isConst) {
-        _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
         return true;
       }
       if (variable.isFinal) {
-        _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, [variable.name]);
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, [variable.name]);
         return true;
       }
       return false;
     }
     if (element is MethodElement) {
-      _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
+      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
       return true;
     }
     return false;
@@ -18420,7 +18388,7 @@
   bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
     sc.Token token = identifier.token;
     if (identical(token.type, sc.TokenType.KEYWORD)) {
-      _errorReporter.reportError2(errorCode, identifier, [identifier.name]);
+      _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
       return true;
     }
     return false;
@@ -18462,7 +18430,7 @@
       }
     }
     // report error
-    _errorReporter.reportError5(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
+    _errorReporter.reportErrorForToken(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
     return true;
   }
 
@@ -18501,7 +18469,7 @@
       return false;
     }
     // report error
-    _errorReporter.reportError5(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
+    _errorReporter.reportErrorForToken(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
     return true;
   }
 
@@ -18516,7 +18484,7 @@
   bool checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
     if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
       SimpleIdentifier methodName = node.name;
-      _errorReporter.reportError2(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
       return true;
     }
     return false;
@@ -18546,9 +18514,9 @@
       }
       if (name == otherConstructor.name) {
         if (name == null || name.length == 0) {
-          _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
         } else {
-          _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name]);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name]);
         }
         return true;
       }
@@ -18558,13 +18526,13 @@
       // fields
       FieldElement field = classElement.getField(name);
       if (field != null) {
-        _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name]);
         return true;
       }
       // methods
       MethodElement method = classElement.getMethod(name);
       if (method != null) {
-        _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name]);
         return true;
       }
     }
@@ -18572,8 +18540,8 @@
   }
 
   /**
-   * This verifies that the [enclosingClass] does not have method and getter with the same
-   * names.
+   * This verifies that the [enclosingClass] does not have a method and getter pair with the
+   * same name on, via inheritance.
    *
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
@@ -18594,7 +18562,7 @@
       }
       // report problem
       hasProblem = true;
-      _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
+      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
           _enclosingClass.displayName,
           inherited.enclosingElement.displayName,
           name]);
@@ -18612,7 +18580,7 @@
       }
       // report problem
       hasProblem = true;
-      _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
+      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
           _enclosingClass.displayName,
           inherited.enclosingElement.displayName,
           name]);
@@ -18672,9 +18640,9 @@
       // report problem
       hasProblem = true;
       if (getter) {
-        _errorReporter.reportError3(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
       } else {
-        _errorReporter.reportError3(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
       }
     }
     // done
@@ -18685,35 +18653,83 @@
    * This verifies that the enclosing class does not have a setter with the same name as the passed
    * instance method declaration.
    *
+   * TODO(jwren) add other "conflicting" error codes into algorithm/ data structure
+   *
    * @param node the method declaration to evaluate
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
    */
-  bool checkForConflictingInstanceMethodSetter(MethodDeclaration node) {
-    if (node.isStatic) {
+  bool checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
+    // Reference all of the class members in this class.
+    NodeList<ClassMember> classMembers = node.members;
+    if (classMembers.isEmpty) {
       return false;
     }
-    // prepare name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
+    // Create a HashMap to track conflicting members, and then loop through members in the class to
+    // construct the HashMap, at the same time, look for violations.  Don't add members if they are
+    // part of a conflict, this prevents multiple warnings for one issue.
+    bool foundError = false;
+    Map<String, ClassMember> memberHashMap = new Map<String, ClassMember>();
+    for (ClassMember classMember in classMembers) {
+      if (classMember is MethodDeclaration) {
+        MethodDeclaration method = classMember;
+        if (method.isStatic) {
+          continue;
+        }
+        // prepare name
+        SimpleIdentifier name = method.name;
+        if (name == null) {
+          continue;
+        }
+        bool addThisMemberToTheMap = true;
+        bool isGetter = method.isGetter;
+        bool isSetter = method.isSetter;
+        bool isOperator = method.isOperator;
+        bool isMethod = !isGetter && !isSetter && !isOperator;
+        // Do lookups in the enclosing class (and the inherited member) if the member is a method or
+        // a setter for StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning.
+        if (isMethod) {
+          String setterName = "${name.name}=";
+          Element enclosingElementOfSetter = null;
+          ClassMember conflictingSetter = memberHashMap[setterName];
+          if (conflictingSetter != null) {
+            enclosingElementOfSetter = conflictingSetter.element.enclosingElement;
+          } else {
+            ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, setterName);
+            if (elementFromInheritance != null) {
+              enclosingElementOfSetter = elementFromInheritance.enclosingElement;
+            }
+          }
+          if (enclosingElementOfSetter != null) {
+            // report problem
+            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
+                _enclosingClass.displayName,
+                name.name,
+                enclosingElementOfSetter.displayName]);
+            foundError = javaBooleanOr(foundError, true);
+            addThisMemberToTheMap = false;
+          }
+        } else if (isSetter) {
+          String methodName = name.name;
+          ClassMember conflictingMethod = memberHashMap[methodName];
+          if (conflictingMethod != null && conflictingMethod is MethodDeclaration && !conflictingMethod.isGetter) {
+            // report problem
+            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [_enclosingClass.displayName, name.name]);
+            foundError = javaBooleanOr(foundError, true);
+            addThisMemberToTheMap = false;
+          }
+        }
+        // Finally, add this member into the HashMap.
+        if (addThisMemberToTheMap) {
+          if (method.isSetter) {
+            memberHashMap["${name.name}="] = method;
+          } else {
+            memberHashMap[name.name] = method;
+          }
+        }
+      }
     }
-    String name = nameNode.name;
-    // ensure that we have enclosing class
-    if (_enclosingClass == null) {
-      return false;
-    }
-    // try to find setter
-    ExecutableElement setter = _inheritanceManager.lookupMember(_enclosingClass, "${name}=");
-    if (setter == null) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, nameNode, [
-        _enclosingClass.displayName,
-        name,
-        setter.enclosingElement.displayName]);
-    return true;
+    return foundError;
   }
 
   /**
@@ -18752,7 +18768,7 @@
     ClassElement setterClass = setter.enclosingElement as ClassElement;
     InterfaceType setterType = setterClass.type;
     // report problem
-    _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, nameNode, [setterType.displayName]);
+    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, nameNode, [setterType.displayName]);
     return true;
   }
 
@@ -18799,7 +18815,7 @@
     ClassElement memberClass = member.enclosingElement as ClassElement;
     InterfaceType memberType = memberClass.type;
     // report problem
-    _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
+    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
     return true;
   }
 
@@ -18817,12 +18833,12 @@
       String name = typeParameter.name;
       // name is same as the name of the enclosing class
       if (_enclosingClass.name == name) {
-        _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
         problemReported = true;
       }
       // check members
       if (_enclosingClass.getMethod(name) != null || _enclosingClass.getGetter(name) != null || _enclosingClass.getSetter(name) != null) {
-        _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
         problemReported = true;
       }
     }
@@ -18853,7 +18869,7 @@
         if (element == null || element.isConst) {
           return false;
         }
-        _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
         return true;
       }
     }
@@ -18873,7 +18889,7 @@
       return false;
     }
     // default constructor is not 'const', report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node, []);
     return true;
   }
 
@@ -18892,11 +18908,11 @@
     // check if there is non-final field
     ConstructorElement constructorElement = node.element;
     ClassElement classElement = constructorElement.enclosingElement;
-    if (!classElement.hasNonFinalField()) {
+    if (!classElement.hasNonFinalField) {
       return false;
     }
     // report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
     return true;
   }
 
@@ -18910,7 +18926,7 @@
    */
   bool checkForConstEvalThrowsException(ThrowExpression node) {
     if (_isEnclosingConstructorConst) {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
       return true;
     }
     return false;
@@ -18925,7 +18941,7 @@
    */
   bool checkForConstFormalParameter(NormalFormalParameter node) {
     if (node.isConst) {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
       return true;
     }
     return false;
@@ -18950,7 +18966,7 @@
       Expression key = entry.key;
       Type2 type = key.staticType;
       if (implementsEqualsWhenNotAllowed(type)) {
-        _errorReporter.reportError2(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
         hasProblems = true;
       }
     }
@@ -18974,9 +18990,9 @@
       ConstructorElement element = node.staticElement;
       if (element != null && !element.isFactory) {
         if (identical((node.keyword as sc.KeywordToken).keyword, sc.Keyword.CONST)) {
-          _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
+          _errorReporter.reportErrorForNode(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
         } else {
-          _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
+          _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
         }
         return true;
       }
@@ -18997,7 +19013,7 @@
   bool checkForConstWithNonConst(InstanceCreationExpression node) {
     ConstructorElement constructorElement = node.staticElement;
     if (constructorElement != null && !constructorElement.isConst) {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
       return true;
     }
     return false;
@@ -19021,7 +19037,7 @@
     }
     // should not be a type parameter
     if (name.staticElement is TypeParameterElement) {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
     }
     // check type arguments
     TypeArgumentList typeArguments = typeName.typeArguments;
@@ -19085,9 +19101,9 @@
     // report as named or default constructor absence
     SimpleIdentifier name = constructorName.name;
     if (name != null) {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
     } else {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
     }
     return true;
   }
@@ -19107,7 +19123,7 @@
       if (formalParameter is DefaultFormalParameter) {
         DefaultFormalParameter defaultFormalParameter = formalParameter;
         if (defaultFormalParameter.defaultValue != null) {
-          _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
           result = true;
         }
       }
@@ -19133,7 +19149,7 @@
       return false;
     }
     // Report problem.
-    _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
     return true;
   }
 
@@ -19188,7 +19204,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError4(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
+    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
     return true;
   }
 
@@ -19211,7 +19227,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, [num]);
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, [num]);
     return true;
   }
 
@@ -19219,18 +19235,14 @@
    * This verifies the passed import has unique name among other exported libraries.
    *
    * @param node the export directive to evaluate
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
    */
-  bool checkForExportDuplicateLibraryName(ExportDirective node) {
-    // prepare import element
-    Element nodeElement = node.element;
-    if (nodeElement is! ExportElement) {
-      return false;
-    }
-    ExportElement nodeExportElement = nodeElement as ExportElement;
+  bool checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
     // prepare exported library
-    LibraryElement nodeLibrary = nodeExportElement.exportedLibrary;
+    LibraryElement nodeLibrary = exportElement.exportedLibrary;
     if (nodeLibrary == null) {
       return false;
     }
@@ -19239,7 +19251,7 @@
     LibraryElement prevLibrary = _nameToExportElement[name];
     if (prevLibrary != null) {
       if (prevLibrary != nodeLibrary) {
-        _errorReporter.reportError2(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
+        _errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
             prevLibrary.definingCompilationUnit.displayName,
             nodeLibrary.definingCompilationUnit.displayName,
             name]);
@@ -19257,19 +19269,15 @@
    * internal library.
    *
    * @param node the export directive to evaluate
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
    */
-  bool checkForExportInternalLibrary(ExportDirective node) {
+  bool checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
     if (_isInSystemLibrary) {
       return false;
     }
-    // prepare export element
-    Element element = node.element;
-    if (element is! ExportElement) {
-      return false;
-    }
-    ExportElement exportElement = element as ExportElement;
     // should be private
     DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
     String uri = exportElement.uri;
@@ -19281,7 +19289,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
     return true;
   }
 
@@ -19328,13 +19336,13 @@
           if (grandParent is ClassDeclaration) {
             ClassElement classElement = grandParent.element;
             Type2 classType = classElement.type;
-            if (classType != null && (classType == _typeProvider.intType || classType == _typeProvider.doubleType)) {
+            if (classType != null && (classType == _intType || classType == _typeProvider.doubleType)) {
               return false;
             }
           }
         }
         // otherwise, report the error
-        _errorReporter.reportError2(errorCode, typeName, [disallowedType.displayName]);
+        _errorReporter.reportErrorForNode(errorCode, typeName, [disallowedType.displayName]);
         return true;
       }
     }
@@ -19374,9 +19382,9 @@
     }
     // report problem
     if (_isEnclosingConstructorConst) {
-      _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
     } else {
-      _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
     }
     return true;
   }
@@ -19391,18 +19399,18 @@
   bool checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
     ConstructorDeclaration constructor = node.getAncestor((node) => node is ConstructorDeclaration);
     if (constructor == null) {
-      _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
       return true;
     }
     // constructor cannot be a factory
     if (constructor.factoryKeyword != null) {
-      _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
       return true;
     }
     // constructor cannot have a redirection
     for (ConstructorInitializer initializer in constructor.initializers) {
       if (initializer is RedirectingConstructorInvocation) {
-        _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
         return true;
       }
     }
@@ -19432,9 +19440,9 @@
       for (VariableDeclaration variable in variables) {
         if (variable.initializer == null) {
           if (node.isConst) {
-            _errorReporter.reportError2(CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, [variable.name.name]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, [variable.name.name]);
           } else if (node.isFinal) {
-            _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, [variable.name.name]);
+            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, [variable.name.name]);
           }
           foundError = true;
         }
@@ -19544,9 +19552,9 @@
     }
     // report problem
     if (_isInStaticMethod) {
-      _errorReporter.reportError2(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
     } else {
-      _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
     }
     return true;
   }
@@ -19555,17 +19563,14 @@
    * This verifies the passed import has unique name among other imported libraries.
    *
    * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
    */
-  bool checkForImportDuplicateLibraryName(ImportDirective node) {
-    // prepare import element
-    ImportElement nodeImportElement = node.element;
-    if (nodeImportElement == null) {
-      return false;
-    }
+  bool checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
     // prepare imported library
-    LibraryElement nodeLibrary = nodeImportElement.importedLibrary;
+    LibraryElement nodeLibrary = importElement.importedLibrary;
     if (nodeLibrary == null) {
       return false;
     }
@@ -19574,7 +19579,7 @@
     LibraryElement prevLibrary = _nameToImportElement[name];
     if (prevLibrary != null) {
       if (prevLibrary != nodeLibrary) {
-        _errorReporter.reportError2(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [
+        _errorReporter.reportErrorForNode(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [
             prevLibrary.definingCompilationUnit.displayName,
             nodeLibrary.definingCompilationUnit.displayName,
             name]);
@@ -19592,18 +19597,15 @@
    * internal library.
    *
    * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
    */
-  bool checkForImportInternalLibrary(ImportDirective node) {
+  bool checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
     if (_isInSystemLibrary) {
       return false;
     }
-    // prepare import element
-    ImportElement importElement = node.element;
-    if (importElement == null) {
-      return false;
-    }
     // should be private
     DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
     String uri = importElement.uri;
@@ -19615,7 +19617,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
     return true;
   }
 
@@ -19643,7 +19645,7 @@
         } else {
           Type2 nType = expression.bestType;
           if (firstType != nType) {
-            _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
             foundError = true;
           }
         }
@@ -19711,7 +19713,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
     return true;
   }
 
@@ -19732,7 +19734,7 @@
     Type2 staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
     ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
     Type2 propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
-    return checkForArgumentTypeNotAssignable(argument, staticParameterType, _typeProvider.intType, propagatedParameterType, _typeProvider.intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+    return checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, propagatedParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
   }
 
   /**
@@ -19758,7 +19760,7 @@
         leftName = getExtendedDisplayName(leftType);
         rightName = getExtendedDisplayName(staticRightType);
       }
-      _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
       return true;
     }
     // TODO(brianwilkerson) Define a hint corresponding to the warning and report it if appropriate.
@@ -19805,7 +19807,7 @@
         leftName = getExtendedDisplayName(leftType);
         rightName = getExtendedDisplayName(rightType);
       }
-      _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
       return true;
     }
     return false;
@@ -19822,12 +19824,12 @@
     if (staticElement is FieldElement) {
       FieldElement fieldElement = staticElement;
       if (fieldElement.isSynthetic) {
-        _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
       } else if (fieldElement.isStatic) {
-        _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
       }
     } else {
-      _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
       return;
     }
   }
@@ -19841,7 +19843,7 @@
    */
   bool checkForInvalidReferenceToThis(ThisExpression node) {
     if (!isThisInValidContext(node)) {
-      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
       return true;
     }
     return false;
@@ -19861,7 +19863,7 @@
     bool foundError = false;
     for (TypeName typeName in arguments) {
       if (typeName.type is TypeParameterType) {
-        _errorReporter.reportError2(errorCode, typeName, [typeName.name]);
+        _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
         foundError = true;
       }
     }
@@ -19967,7 +19969,7 @@
     // check accessors
     for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
       if (className == accessor.name) {
-        _errorReporter.reportError4(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
         problemReported = true;
       }
     }
@@ -20041,13 +20043,13 @@
     // it is dynamic which is assignable to everything).
     if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
       if (enclosingClassForCounterpart == null) {
-        _errorReporter.reportError2(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
+        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
             accessorTextName,
             setterType.displayName,
             getterType.displayName]);
         return true;
       } else {
-        _errorReporter.reportError2(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
+        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
             accessorTextName,
             setterType.displayName,
             getterType.displayName,
@@ -20070,10 +20072,10 @@
     int withoutCount = _returnsWithout.length;
     if (withCount > 0 && withoutCount > 0) {
       for (int i = 0; i < withCount; i++) {
-        _errorReporter.reportError5(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWith[i].keyword, []);
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWith[i].keyword, []);
       }
       for (int i = 0; i < withoutCount; i++) {
-        _errorReporter.reportError5(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWithout[i].keyword, []);
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWithout[i].keyword, []);
       }
       return true;
     }
@@ -20091,7 +20093,7 @@
   bool checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
     for (ConstructorElement constructor in mixinElement.constructors) {
       if (!constructor.isSynthetic && !constructor.isFactory) {
-        _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
         return true;
       }
     }
@@ -20110,7 +20112,7 @@
     InterfaceType mixinSupertype = mixinElement.supertype;
     if (mixinSupertype != null) {
       if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
-        _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
         return true;
       }
     }
@@ -20126,8 +20128,8 @@
    * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
    */
   bool checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
-    if (mixinElement.hasReferenceToSuper()) {
-      _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
+    if (mixinElement.hasReferenceToSuper) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
     }
     return false;
   }
@@ -20145,7 +20147,7 @@
       if (initializer is SuperConstructorInvocation) {
         numSuperInitializers++;
         if (numSuperInitializers > 1) {
-          _errorReporter.reportError2(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
         }
       }
     }
@@ -20161,7 +20163,7 @@
    */
   bool checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
     if (!_isInSystemLibrary && !_hasExtUri) {
-      _errorReporter.reportError2(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
+      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
       return true;
     }
     return false;
@@ -20195,9 +20197,9 @@
     // report as named or default constructor absence
     SimpleIdentifier name = constructorName.name;
     if (name != null) {
-      _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
     } else {
-      _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
     }
     return true;
   }
@@ -20226,7 +20228,7 @@
     ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
     if (superUnnamedConstructor != null) {
       if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
         return true;
       }
       if (superUnnamedConstructor.isDefaultConstructor) {
@@ -20234,7 +20236,7 @@
       }
     }
     // report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
     return true;
   }
 
@@ -20383,7 +20385,7 @@
   bool checkForNonBoolCondition(Expression condition) {
     Type2 conditionType = getStaticType(condition);
     if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
-      _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
       return true;
     }
     return false;
@@ -20401,13 +20403,13 @@
     Type2 type = getStaticType(expression);
     if (type is InterfaceType) {
       if (!type.isAssignableTo(_boolType)) {
-        _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
         return true;
       }
     } else if (type is FunctionType) {
       FunctionType functionType = type;
       if (functionType.typeArguments.length == 0 && !functionType.returnType.isAssignableTo(_boolType)) {
-        _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
         return true;
       }
     }
@@ -20424,7 +20426,7 @@
   bool checkForNonBoolNegationExpression(Expression expression) {
     Type2 conditionType = getStaticType(expression);
     if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
-      _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
       return true;
     }
     return false;
@@ -20459,7 +20461,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
     return true;
   }
 
@@ -20482,7 +20484,7 @@
     if (typeName != null) {
       Type2 type = typeName.type;
       if (type != null && !type.isVoid) {
-        _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
+        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
       }
     }
     // no warning
@@ -20500,7 +20502,7 @@
     if (typeName != null) {
       Type2 type = typeName.type;
       if (type != null && !type.isVoid) {
-        _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
+        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
       }
     }
     return false;
@@ -20525,7 +20527,7 @@
     NodeList<FormalParameter> formalParameters = parameterList.parameters;
     for (FormalParameter formalParameter in formalParameters) {
       if (formalParameter.kind.isOptional) {
-        _errorReporter.reportError2(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
         foundError = true;
       }
     }
@@ -20550,7 +20552,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
     return true;
   }
 
@@ -20576,7 +20578,7 @@
           return false;
         }
         // report error
-        _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
         return true;
       }
     }
@@ -20604,7 +20606,7 @@
       return false;
     }
     // report error
-    _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
     return true;
   }
 
@@ -20644,7 +20646,7 @@
     if (redirectedConstructor != null) {
       for (FormalParameter parameter in node.parameters.parameters) {
         if (parameter is DefaultFormalParameter && parameter.defaultValue != null) {
-          _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
           errorReported = true;
         }
       }
@@ -20654,7 +20656,7 @@
     for (ConstructorInitializer initializer in node.initializers) {
       if (initializer is RedirectingConstructorInvocation) {
         if (numRedirections > 0) {
-          _errorReporter.reportError2(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
           errorReported = true;
         }
         numRedirections++;
@@ -20664,11 +20666,11 @@
     if (numRedirections > 0) {
       for (ConstructorInitializer initializer in node.initializers) {
         if (initializer is SuperConstructorInvocation) {
-          _errorReporter.reportError2(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
           errorReported = true;
         }
         if (initializer is ConstructorFieldInitializer) {
-          _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
           errorReported = true;
         }
       }
@@ -20710,7 +20712,7 @@
       return false;
     }
     // report error
-    _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
     return true;
   }
 
@@ -20723,7 +20725,7 @@
    */
   bool checkForRethrowOutsideCatch(RethrowExpression node) {
     if (!_isInCatchClause) {
-      _errorReporter.reportError2(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
       return true;
     }
     return false;
@@ -20748,7 +20750,7 @@
       return false;
     }
     // report error
-    _errorReporter.reportError2(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body, []);
     return true;
   }
 
@@ -20770,7 +20772,7 @@
       if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
         return false;
       }
-      _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
           staticReturnType.displayName,
           expectedReturnType.displayName,
           _enclosingFunction.displayName]);
@@ -20780,7 +20782,7 @@
     if (isStaticAssignable) {
       return false;
     }
-    _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
         staticReturnType.displayName,
         expectedReturnType.displayName,
         _enclosingFunction.displayName]);
@@ -20814,7 +20816,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
+    _errorReporter.reportErrorForNode(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
     return true;
   }
 
@@ -20848,7 +20850,7 @@
         return false;
       }
       // report problem
-      _errorReporter.reportError2(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [expressionType, caseType]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [expressionType, caseType]);
       return true;
     }
     return false;
@@ -20866,7 +20868,7 @@
     if (!hasTypedefSelfReference(element)) {
       return false;
     }
-    _errorReporter.reportError2(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
     return true;
   }
 
@@ -20881,7 +20883,7 @@
     if (!hasTypedefSelfReference(element)) {
       return false;
     }
-    _errorReporter.reportError2(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
     return true;
   }
 
@@ -20923,12 +20925,12 @@
         boundType = boundType.substitute2(typeArguments, typeParameters);
         if (!argType.isSubtypeOf(boundType)) {
           ErrorCode errorCode;
-          if (isInConstConstructorInvocation(node)) {
+          if (_isInConstInstanceCreation) {
             errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
           } else {
             errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
           }
-          _errorReporter.reportError2(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
+          _errorReporter.reportErrorForNode(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
           foundError = true;
         }
       }
@@ -20948,7 +20950,7 @@
     if (_isInStaticMethod || _isInStaticVariableDeclaration) {
       Type2 type = node.type;
       if (type is TypeParameterType) {
-        _errorReporter.reportError2(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
+        _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
         return true;
       }
     }
@@ -20974,7 +20976,7 @@
       return false;
     }
     // report problem
-    _errorReporter.reportError2(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, node, [element.displayName]);
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, node, [element.displayName]);
     return true;
   }
 
@@ -21019,7 +21021,7 @@
     ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
     if (superUnnamedConstructor != null) {
       if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
         return true;
       }
       if (!superUnnamedConstructor.isDefaultConstructor) {
@@ -21031,11 +21033,11 @@
           offset = returnType.offset;
           length = (name != null ? name.end : returnType.end) - offset;
         }
-        _errorReporter.reportError4(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
       }
       return false;
     }
-    _errorReporter.reportError2(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
     return true;
   }
 
@@ -21062,7 +21064,7 @@
     if (identical(enclosingElement, _enclosingClass)) {
       return false;
     }
-    _errorReporter.reportError2(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name, [name.name]);
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name, [name.name]);
     return true;
   }
 
@@ -21071,7 +21073,7 @@
     if (element is FieldFormalParameterElement) {
       FieldElement fieldElement = element.field;
       if (fieldElement == null || fieldElement.isSynthetic) {
-        _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
       } else {
         ParameterElement parameterElement = node.element;
         if (parameterElement is FieldFormalParameterElementImpl) {
@@ -21079,17 +21081,17 @@
           Type2 declaredType = fieldFormal.type;
           Type2 fieldType = fieldElement.type;
           if (fieldElement.isSynthetic) {
-            _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
           } else if (fieldElement.isStatic) {
-            _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
           } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+            _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
           }
         } else {
           if (fieldElement.isSynthetic) {
-            _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
           } else if (fieldElement.isStatic) {
-            _errorReporter.reportError2(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
           }
         }
       }
@@ -21129,12 +21131,12 @@
       expected = 0;
     }
     if (expected != -1 && numParameters != expected) {
-      _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
       return true;
     }
     // check for operator "-"
     if ("-" == name && numParameters > 1) {
-      _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
       return true;
     }
     // OK
@@ -21160,7 +21162,7 @@
     }
     NodeList<FormalParameter> parameters = parameterList.parameters;
     if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
-      _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
       return true;
     }
     return false;
@@ -21186,7 +21188,7 @@
     }
     ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
     if (callMethod == null || callMethod is! MethodElement || (callMethod as MethodElement).isAbstract) {
-      _errorReporter.reportError2(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
+      _errorReporter.reportErrorForNode(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
       return true;
     }
     return false;
@@ -21215,7 +21217,7 @@
     for (TypeName interfaceNode in implementsClause.interfaces) {
       if (interfaceNode.type == superType) {
         hasProblem = true;
-        _errorReporter.reportError2(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, [superType.displayName]);
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, [superType.displayName]);
       }
     }
     // done
@@ -21365,7 +21367,7 @@
    */
   bool implementsEqualsWhenNotAllowed(Type2 type) {
     // ignore int or String
-    if (type == null || type == _typeProvider.intType || type == _typeProvider.stringType) {
+    if (type == null || type == _intType || type == _typeProvider.stringType) {
       return false;
     }
     // prepare ClassElement
@@ -21396,18 +21398,6 @@
   }
 
   /**
-   * @return `true` if the given [AstNode] is the part of constant constructor
-   *         invocation.
-   */
-  bool isInConstConstructorInvocation(AstNode node) {
-    InstanceCreationExpression creation = node.getAncestor((node) => node is InstanceCreationExpression);
-    if (creation == null) {
-      return false;
-    }
-    return creation.isConst;
-  }
-
-  /**
    * Return `true` iff the passed [ClassElement] has a method, getter or setter that
    * matches the name of the passed [ExecutableElement] in either the class itself, or one of
    * its' mixins.
@@ -21540,13 +21530,13 @@
           builder.append(separator);
         }
         builder.append(classElt.displayName);
-        _errorReporter.reportError4(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
         return true;
       } else {
         // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
         InterfaceType supertype = classElt.supertype;
         ErrorCode errorCode = (supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS);
-        _errorReporter.reportError4(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
+        _errorReporter.reportErrorForOffset(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
         return true;
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index b2366e8..69c91d7 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -623,7 +623,7 @@
    *
    * @return `true` if there were any tokens changed as a result of the modification
    */
-  bool hasNonWhitespaceChange() => _hasNonWhitespaceChange2;
+  bool get hasNonWhitespaceChange => _hasNonWhitespaceChange2;
 
   /**
    * Given the stream of tokens scanned from the original source, the modified source (the result of
@@ -716,7 +716,7 @@
     // the first new token.
     //
     Token newFirst = _leftToken.next;
-    while (newFirst != _rightToken && oldFirst != oldRightToken && newFirst.type != TokenType.EOF && equals3(oldFirst, newFirst)) {
+    while (newFirst != _rightToken && oldFirst != oldRightToken && newFirst.type != TokenType.EOF && equalTokens(oldFirst, newFirst)) {
       _tokenMap.put(oldFirst, newFirst);
       oldLeftToken = oldFirst;
       oldFirst = oldFirst.next;
@@ -724,7 +724,7 @@
       newFirst = newFirst.next;
     }
     Token newLast = _rightToken.previous;
-    while (newLast != _leftToken && oldLast != oldLeftToken && newLast.type != TokenType.EOF && equals3(oldLast, newLast)) {
+    while (newLast != _leftToken && oldLast != oldLeftToken && newLast.type != TokenType.EOF && equalTokens(oldLast, newLast)) {
       _tokenMap.put(oldLast, newLast);
       oldRightToken = oldLast;
       oldLast = oldLast.previous;
@@ -764,7 +764,7 @@
    * @param newToken the token from the new stream that is being compared
    * @return `true` if the two tokens are equal to each other
    */
-  bool equals3(Token oldToken, Token newToken) => identical(oldToken.type, newToken.type) && oldToken.length == newToken.length && oldToken.lexeme == newToken.lexeme;
+  bool equalTokens(Token oldToken, Token newToken) => identical(oldToken.type, newToken.type) && oldToken.length == newToken.length && oldToken.lexeme == newToken.lexeme;
 }
 
 /**
@@ -872,7 +872,7 @@
    *
    * @return `true` if any unmatched groups were found during the parse
    */
-  bool hasUnmatchedGroups() => _hasUnmatchedGroups2;
+  bool get hasUnmatchedGroups => _hasUnmatchedGroups2;
 
   /**
    * Set whether documentation tokens should be scanned.
@@ -1007,7 +1007,7 @@
       return tokenizeTilde(next);
     }
     if (next == 0x5C) {
-      appendToken2(TokenType.BACKSLASH);
+      appendTokenOfType(TokenType.BACKSLASH);
       return _reader.advance();
     }
     if (next == 0x23) {
@@ -1022,19 +1022,19 @@
       return _reader.advance();
     }
     if (next == 0x2C) {
-      appendToken2(TokenType.COMMA);
+      appendTokenOfType(TokenType.COMMA);
       return _reader.advance();
     }
     if (next == 0x3A) {
-      appendToken2(TokenType.COLON);
+      appendTokenOfType(TokenType.COLON);
       return _reader.advance();
     }
     if (next == 0x3B) {
-      appendToken2(TokenType.SEMICOLON);
+      appendTokenOfType(TokenType.SEMICOLON);
       return _reader.advance();
     }
     if (next == 0x3F) {
-      appendToken2(TokenType.QUESTION);
+      appendTokenOfType(TokenType.QUESTION);
       return _reader.advance();
     }
     if (next == 0x5D) {
@@ -1042,7 +1042,7 @@
       return _reader.advance();
     }
     if (next == 0x60) {
-      appendToken2(TokenType.BACKPING);
+      appendTokenOfType(TokenType.BACKPING);
       return _reader.advance();
     }
     if (next == 0x7B) {
@@ -1057,7 +1057,7 @@
       return tokenizeSlashOrComment(next);
     }
     if (next == 0x40) {
-      appendToken2(TokenType.AT);
+      appendTokenOfType(TokenType.AT);
       return _reader.advance();
     }
     if (next == 0x22 || next == 0x27) {
@@ -1184,7 +1184,7 @@
     }
   }
 
-  void appendStringToken2(TokenType type, String value, int offset) {
+  void appendStringTokenWithOffset(TokenType type, String value, int offset) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
     } else {
@@ -1194,7 +1194,7 @@
     }
   }
 
-  void appendToken2(TokenType type) {
+  void appendTokenOfType(TokenType type) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new Token(type, _tokenStart));
     } else {
@@ -1204,7 +1204,7 @@
     }
   }
 
-  void appendToken3(TokenType type, int offset) {
+  void appendTokenOfTypeWithOffset(TokenType type, int offset) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new Token(type, offset));
     } else {
@@ -1254,21 +1254,21 @@
   int select(int choice, TokenType yesType, TokenType noType) {
     int next = _reader.advance();
     if (next == choice) {
-      appendToken2(yesType);
+      appendTokenOfType(yesType);
       return _reader.advance();
     } else {
-      appendToken2(noType);
+      appendTokenOfType(noType);
       return next;
     }
   }
 
-  int select2(int choice, TokenType yesType, TokenType noType, int offset) {
+  int selectWithOffset(int choice, TokenType yesType, TokenType noType, int offset) {
     int next = _reader.advance();
     if (next == choice) {
-      appendToken3(yesType, offset);
+      appendTokenOfTypeWithOffset(yesType, offset);
       return _reader.advance();
     } else {
-      appendToken3(noType, offset);
+      appendTokenOfTypeWithOffset(noType, offset);
       return next;
     }
   }
@@ -1277,13 +1277,13 @@
     // && &= &
     next = _reader.advance();
     if (next == 0x26) {
-      appendToken2(TokenType.AMPERSAND_AMPERSAND);
+      appendTokenOfType(TokenType.AMPERSAND_AMPERSAND);
       return _reader.advance();
     } else if (next == 0x3D) {
-      appendToken2(TokenType.AMPERSAND_EQ);
+      appendTokenOfType(TokenType.AMPERSAND_EQ);
       return _reader.advance();
     } else {
-      appendToken2(TokenType.AMPERSAND);
+      appendTokenOfType(TokenType.AMPERSAND);
       return next;
     }
   }
@@ -1292,13 +1292,13 @@
     // | || |=
     next = _reader.advance();
     if (next == 0x7C) {
-      appendToken2(TokenType.BAR_BAR);
+      appendTokenOfType(TokenType.BAR_BAR);
       return _reader.advance();
     } else if (next == 0x3D) {
-      appendToken2(TokenType.BAR_EQ);
+      appendTokenOfType(TokenType.BAR_EQ);
       return _reader.advance();
     } else {
-      appendToken2(TokenType.BAR);
+      appendTokenOfType(TokenType.BAR);
       return next;
     }
   }
@@ -1313,7 +1313,7 @@
     } else if (0x2E == next) {
       return select(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD);
     } else {
-      appendToken2(TokenType.PERIOD);
+      appendTokenOfType(TokenType.PERIOD);
       return next;
     }
   }
@@ -1322,13 +1322,13 @@
     // = == =>
     next = _reader.advance();
     if (next == 0x3D) {
-      appendToken2(TokenType.EQ_EQ);
+      appendTokenOfType(TokenType.EQ_EQ);
       return _reader.advance();
     } else if (next == 0x3E) {
-      appendToken2(TokenType.FUNCTION);
+      appendTokenOfType(TokenType.FUNCTION);
       return _reader.advance();
     }
-    appendToken2(TokenType.EQ);
+    appendTokenOfType(TokenType.EQ);
     return next;
   }
 
@@ -1336,10 +1336,10 @@
     // ! !=
     next = _reader.advance();
     if (next == 0x3D) {
-      appendToken2(TokenType.BANG_EQ);
+      appendTokenOfType(TokenType.BANG_EQ);
       return _reader.advance();
     }
-    appendToken2(TokenType.BANG);
+    appendTokenOfType(TokenType.BANG);
     return next;
   }
 
@@ -1381,9 +1381,9 @@
     if (!hasDigit) {
       appendStringToken(TokenType.INT, _reader.getString(start, -2));
       if (0x2E == next) {
-        return select2(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, _reader.offset - 1);
+        return selectWithOffset(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, _reader.offset - 1);
       }
-      appendToken3(TokenType.PERIOD, _reader.offset - 1);
+      appendTokenOfTypeWithOffset(TokenType.PERIOD, _reader.offset - 1);
       return bigSwitch(next);
     }
     appendStringToken(TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
@@ -1394,19 +1394,19 @@
     // > >= >> >>=
     next = _reader.advance();
     if (0x3D == next) {
-      appendToken2(TokenType.GT_EQ);
+      appendTokenOfType(TokenType.GT_EQ);
       return _reader.advance();
     } else if (0x3E == next) {
       next = _reader.advance();
       if (0x3D == next) {
-        appendToken2(TokenType.GT_GT_EQ);
+        appendTokenOfType(TokenType.GT_GT_EQ);
         return _reader.advance();
       } else {
-        appendToken2(TokenType.GT_GT);
+        appendTokenOfType(TokenType.GT_GT);
         return next;
       }
     } else {
-      appendToken2(TokenType.GT);
+      appendTokenOfType(TokenType.GT);
       return next;
     }
   }
@@ -1453,7 +1453,7 @@
         BeginToken begin = findTokenMatchingClosingBraceInInterpolationExpression();
         if (begin == null) {
           beginToken();
-          appendToken2(TokenType.CLOSE_CURLY_BRACKET);
+          appendTokenOfType(TokenType.CLOSE_CURLY_BRACKET);
           next = _reader.advance();
           beginToken();
           return next;
@@ -1482,7 +1482,7 @@
   }
 
   int tokenizeInterpolatedIdentifier(int next, int start) {
-    appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
+    appendStringTokenWithOffset(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
     if ((0x41 <= next && next <= 0x5A) || (0x61 <= next && next <= 0x7A) || next == 0x5F) {
       beginToken();
       next = tokenizeKeywordOrIdentifier(next, false);
@@ -1515,12 +1515,12 @@
     // < <= << <<=
     next = _reader.advance();
     if (0x3D == next) {
-      appendToken2(TokenType.LT_EQ);
+      appendTokenOfType(TokenType.LT_EQ);
       return _reader.advance();
     } else if (0x3C == next) {
       return select(0x3D, TokenType.LT_LT_EQ, TokenType.LT_LT);
     } else {
-      appendToken2(TokenType.LT);
+      appendTokenOfType(TokenType.LT);
       return next;
     }
   }
@@ -1529,13 +1529,13 @@
     // - -- -=
     next = _reader.advance();
     if (next == 0x2D) {
-      appendToken2(TokenType.MINUS_MINUS);
+      appendTokenOfType(TokenType.MINUS_MINUS);
       return _reader.advance();
     } else if (next == 0x3D) {
-      appendToken2(TokenType.MINUS_EQ);
+      appendTokenOfType(TokenType.MINUS_EQ);
       return _reader.advance();
     } else {
-      appendToken2(TokenType.MINUS);
+      appendTokenOfType(TokenType.MINUS);
       return next;
     }
   }
@@ -1707,13 +1707,13 @@
     // + ++ +=
     next = _reader.advance();
     if (0x2B == next) {
-      appendToken2(TokenType.PLUS_PLUS);
+      appendTokenOfType(TokenType.PLUS_PLUS);
       return _reader.advance();
     } else if (0x3D == next) {
-      appendToken2(TokenType.PLUS_EQ);
+      appendTokenOfType(TokenType.PLUS_EQ);
       return _reader.advance();
     } else {
-      appendToken2(TokenType.PLUS);
+      appendTokenOfType(TokenType.PLUS);
       return next;
     }
   }
@@ -1778,10 +1778,10 @@
     } else if (0x2F == next) {
       return tokenizeSingleLineComment(next);
     } else if (0x3D == next) {
-      appendToken2(TokenType.SLASH_EQ);
+      appendTokenOfType(TokenType.SLASH_EQ);
       return _reader.advance();
     } else {
-      appendToken2(TokenType.SLASH);
+      appendTokenOfType(TokenType.SLASH);
       return next;
     }
   }
@@ -1828,7 +1828,7 @@
         return next;
       }
     }
-    appendToken2(TokenType.HASH);
+    appendTokenOfType(TokenType.HASH);
     return _reader.advance();
   }
 
@@ -1838,7 +1838,7 @@
     if (next == 0x2F) {
       return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
     } else {
-      appendToken2(TokenType.TILDE);
+      appendTokenOfType(TokenType.TILDE);
       return next;
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 4381adf..58abe3d 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -191,7 +191,7 @@
     List<String> uris = this.uris;
     ChangeSet changeSet = new ChangeSet();
     for (String uri in uris) {
-      changeSet.added(_analysisContext.sourceFactory.forUri(uri));
+      changeSet.addedSource(_analysisContext.sourceFactory.forUri(uri));
     }
     _analysisContext.applyChanges(changeSet);
   }
@@ -328,7 +328,7 @@
    *
    * @return `true` if this installation of the SDK has documentation
    */
-  bool hasDocumentation() => docDirectory.exists();
+  bool get hasDocumentation => docDirectory.exists();
 
   /**
    * Return `true` if the Dartium binary is available.
@@ -389,7 +389,7 @@
     JavaFile librariesFile = new JavaFile.relative(new JavaFile.relative(libraryDirectory, _INTERNAL_DIR), _LIBRARIES_FILE);
     try {
       String contents = librariesFile.readAsStringSync();
-      _libraryMap = new SdkLibrariesReader(useDart2jsPaths).readFrom(librariesFile, contents);
+      _libraryMap = new SdkLibrariesReader(useDart2jsPaths).readFromFile(librariesFile, contents);
     } on JavaException catch (exception) {
       AnalysisEngine.instance.logger.logError2("Could not initialize the library map from ${librariesFile.getAbsolutePath()}", exception);
       _libraryMap = new LibraryMap();
@@ -452,7 +452,7 @@
    * @param libraryFileContents the contents from the library file
    * @return the library map read from the given source
    */
-  LibraryMap readFrom(JavaFile file, String libraryFileContents) => readFrom2(new FileBasedSource.con2(file, UriKind.FILE_URI), libraryFileContents);
+  LibraryMap readFromFile(JavaFile file, String libraryFileContents) => readFromSource(new FileBasedSource.con2(file, UriKind.FILE_URI), libraryFileContents);
 
   /**
    * Return the library map read from the given source.
@@ -461,7 +461,7 @@
    * @param libraryFileContents the contents from the library file
    * @return the library map read from the given source
    */
-  LibraryMap readFrom2(Source source, String libraryFileContents) {
+  LibraryMap readFromSource(Source source, String libraryFileContents) {
     BooleanErrorListener errorListener = new BooleanErrorListener();
     Scanner scanner = new Scanner(source, new CharSequenceReader(libraryFileContents), errorListener);
     Parser parser = new Parser(source, errorListener);
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 8b3b3e9..3a2cf31 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -93,7 +93,7 @@
     try {
       Uri uri = parseUriWithException(absoluteUri);
       if (uri.isAbsolute) {
-        return resolveUri2(null, uri);
+        return internalResolveUri(null, uri);
       }
     } on URISyntaxException catch (exception) {
     }
@@ -171,7 +171,7 @@
     }
     try {
       // Force the creation of an escaped URI to deal with spaces, etc.
-      return resolveUri2(containingSource, parseUriWithException(containedUri));
+      return internalResolveUri(containingSource, parseUriWithException(containedUri));
     } on URISyntaxException catch (exception) {
       return null;
     }
@@ -212,7 +212,7 @@
    * @param containedUri the (possibly relative) URI to be resolved against the containing source
    * @return the source representing the contained URI
    */
-  Source resolveUri2(Source containingSource, Uri containedUri) {
+  Source internalResolveUri(Source containingSource, Uri containedUri) {
     if (containedUri.isAbsolute) {
       for (UriResolver resolver in _resolvers) {
         Source result = resolver.resolveAbsolute(containedUri);
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index dd07792..6a74d97 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -23,7 +23,10 @@
    * @return the value of the element at the given index
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
-  static bool get(int array, Enum index) => get2(array, index.ordinal);
+  static bool get(int array, int index) {
+    checkIndex(index);
+    return (array & (1 << index)) > 0;
+  }
 
   /**
    * Return the value of the element at the given index.
@@ -33,10 +36,7 @@
    * @return the value of the element at the given index
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
-  static bool get2(int array, int index) {
-    checkIndex(index);
-    return (array & (1 << index)) > 0;
-  }
+  static bool getEnum(int array, Enum index) => get(array, index.ordinal);
 
   /**
    * Set the value of the element at the given index to the given value.
@@ -47,18 +47,7 @@
    * @return the updated value of the array
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
-  static int set(int array, Enum index, bool value) => set2(array, index.ordinal, value);
-
-  /**
-   * Set the value of the element at the given index to the given value.
-   *
-   * @param array the array being modified
-   * @param index the index of the element being set
-   * @param value the value to be assigned to the element
-   * @return the updated value of the array
-   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
-   */
-  static int set2(int array, int index, bool value) {
+  static int set(int array, int index, bool value) {
     checkIndex(index);
     if (value) {
       return array | (1 << index);
@@ -68,6 +57,17 @@
   }
 
   /**
+   * Set the value of the element at the given index to the given value.
+   *
+   * @param array the array being modified
+   * @param index the index of the element being set
+   * @param value the value to be assigned to the element
+   * @return the updated value of the array
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static int setEnum(int array, Enum index, bool value) => set(array, index.ordinal, value);
+
+  /**
    * Throw an exception if the index is not within the bounds allowed for an integer-encoded array
    * of boolean values.
    *
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 4ba875c..a219901 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.13.0-dev.3
+version: 0.13.0-dev.4
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 6c75ce2..f1f60ae 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -325,39 +325,39 @@
 class AstFactory {
   static AdjacentStrings adjacentStrings(List<StringLiteral> strings) => new AdjacentStrings(list(strings));
 
-  static Annotation annotation(Identifier name) => new Annotation(TokenFactory.token3(TokenType.AT), name, null, null, null);
+  static Annotation annotation(Identifier name) => new Annotation(TokenFactory.tokenFromType(TokenType.AT), name, null, null, null);
 
-  static Annotation annotation2(Identifier name, SimpleIdentifier constructorName, ArgumentList arguments) => new Annotation(TokenFactory.token3(TokenType.AT), name, TokenFactory.token3(TokenType.PERIOD), constructorName, arguments);
+  static Annotation annotation2(Identifier name, SimpleIdentifier constructorName, ArgumentList arguments) => new Annotation(TokenFactory.tokenFromType(TokenType.AT), name, TokenFactory.tokenFromType(TokenType.PERIOD), constructorName, arguments);
 
-  static ArgumentDefinitionTest argumentDefinitionTest(String identifier) => new ArgumentDefinitionTest(TokenFactory.token3(TokenType.QUESTION), identifier3(identifier));
+  static ArgumentDefinitionTest argumentDefinitionTest(String identifier) => new ArgumentDefinitionTest(TokenFactory.tokenFromType(TokenType.QUESTION), identifier3(identifier));
 
-  static ArgumentList argumentList(List<Expression> arguments) => new ArgumentList(TokenFactory.token3(TokenType.OPEN_PAREN), list(arguments), TokenFactory.token3(TokenType.CLOSE_PAREN));
+  static ArgumentList argumentList(List<Expression> arguments) => new ArgumentList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(arguments), TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
-  static AsExpression asExpression(Expression expression, TypeName type) => new AsExpression(expression, TokenFactory.token(Keyword.AS), type);
+  static AsExpression asExpression(Expression expression, TypeName type) => new AsExpression(expression, TokenFactory.tokenFromKeyword(Keyword.AS), type);
 
-  static AssertStatement assertStatement(Expression condition) => new AssertStatement(TokenFactory.token(Keyword.ASSERT), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.SEMICOLON));
+  static AssertStatement assertStatement(Expression condition) => new AssertStatement(TokenFactory.tokenFromKeyword(Keyword.ASSERT), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), condition, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static AssignmentExpression assignmentExpression(Expression leftHandSide, TokenType operator, Expression rightHandSide) => new AssignmentExpression(leftHandSide, TokenFactory.token3(operator), rightHandSide);
+  static AssignmentExpression assignmentExpression(Expression leftHandSide, TokenType operator, Expression rightHandSide) => new AssignmentExpression(leftHandSide, TokenFactory.tokenFromType(operator), rightHandSide);
 
-  static BinaryExpression binaryExpression(Expression leftOperand, TokenType operator, Expression rightOperand) => new BinaryExpression(leftOperand, TokenFactory.token3(operator), rightOperand);
+  static BinaryExpression binaryExpression(Expression leftOperand, TokenType operator, Expression rightOperand) => new BinaryExpression(leftOperand, TokenFactory.tokenFromType(operator), rightOperand);
 
-  static Block block(List<Statement> statements) => new Block(TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(statements), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+  static Block block(List<Statement> statements) => new Block(TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET), list(statements), TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static BlockFunctionBody blockFunctionBody(Block block) => new BlockFunctionBody(block);
 
   static BlockFunctionBody blockFunctionBody2(List<Statement> statements) => new BlockFunctionBody(block(statements));
 
-  static BooleanLiteral booleanLiteral(bool value) => new BooleanLiteral(value ? TokenFactory.token(Keyword.TRUE) : TokenFactory.token(Keyword.FALSE), value);
+  static BooleanLiteral booleanLiteral(bool value) => new BooleanLiteral(value ? TokenFactory.tokenFromKeyword(Keyword.TRUE) : TokenFactory.tokenFromKeyword(Keyword.FALSE), value);
 
-  static BreakStatement breakStatement() => new BreakStatement(TokenFactory.token(Keyword.BREAK), null, TokenFactory.token3(TokenType.SEMICOLON));
+  static BreakStatement breakStatement() => new BreakStatement(TokenFactory.tokenFromKeyword(Keyword.BREAK), null, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static BreakStatement breakStatement2(String label) => new BreakStatement(TokenFactory.token(Keyword.BREAK), identifier3(label), TokenFactory.token3(TokenType.SEMICOLON));
+  static BreakStatement breakStatement2(String label) => new BreakStatement(TokenFactory.tokenFromKeyword(Keyword.BREAK), identifier3(label), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static IndexExpression cascadedIndexExpression(Expression index) => new IndexExpression.forCascade(TokenFactory.token3(TokenType.PERIOD_PERIOD), TokenFactory.token3(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.token3(TokenType.CLOSE_SQUARE_BRACKET));
+  static IndexExpression cascadedIndexExpression(Expression index) => new IndexExpression.forCascade(TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD), TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
-  static MethodInvocation cascadedMethodInvocation(String methodName, List<Expression> arguments) => new MethodInvocation(null, TokenFactory.token3(TokenType.PERIOD_PERIOD), identifier3(methodName), argumentList(arguments));
+  static MethodInvocation cascadedMethodInvocation(String methodName, List<Expression> arguments) => new MethodInvocation(null, TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD), identifier3(methodName), argumentList(arguments));
 
-  static PropertyAccess cascadedPropertyAccess(String propertyName) => new PropertyAccess(null, TokenFactory.token3(TokenType.PERIOD_PERIOD), identifier3(propertyName));
+  static PropertyAccess cascadedPropertyAccess(String propertyName) => new PropertyAccess(null, TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD), identifier3(propertyName));
 
   static CascadeExpression cascadeExpression(Expression target, List<Expression> cascadeSections) => new CascadeExpression(target, list(cascadeSections));
 
@@ -369,11 +369,11 @@
 
   static CatchClause catchClause4(TypeName exceptionType, String exceptionParameter, List<Statement> statements) => catchClause5(exceptionType, exceptionParameter, null, statements);
 
-  static CatchClause catchClause5(TypeName exceptionType, String exceptionParameter, String stackTraceParameter, List<Statement> statements) => new CatchClause(exceptionType == null ? null : TokenFactory.token4(TokenType.IDENTIFIER, "on"), exceptionType, exceptionParameter == null ? null : TokenFactory.token(Keyword.CATCH), exceptionParameter == null ? null : TokenFactory.token3(TokenType.OPEN_PAREN), identifier3(exceptionParameter), stackTraceParameter == null ? null : TokenFactory.token3(TokenType.COMMA), stackTraceParameter == null ? null : identifier3(stackTraceParameter), exceptionParameter == null ? null : TokenFactory.token3(TokenType.CLOSE_PAREN), block(statements));
+  static CatchClause catchClause5(TypeName exceptionType, String exceptionParameter, String stackTraceParameter, List<Statement> statements) => new CatchClause(exceptionType == null ? null : TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "on"), exceptionType, exceptionParameter == null ? null : TokenFactory.tokenFromKeyword(Keyword.CATCH), exceptionParameter == null ? null : TokenFactory.tokenFromType(TokenType.OPEN_PAREN), identifier3(exceptionParameter), stackTraceParameter == null ? null : TokenFactory.tokenFromType(TokenType.COMMA), stackTraceParameter == null ? null : identifier3(stackTraceParameter), exceptionParameter == null ? null : TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), block(statements));
 
-  static ClassDeclaration classDeclaration(Keyword abstractKeyword, String name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, List<ClassMember> members) => new ClassDeclaration(null, null, abstractKeyword == null ? null : TokenFactory.token(abstractKeyword), TokenFactory.token(Keyword.CLASS), identifier3(name), typeParameters, extendsClause, withClause, implementsClause, TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+  static ClassDeclaration classDeclaration(Keyword abstractKeyword, String name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, List<ClassMember> members) => new ClassDeclaration(null, null, abstractKeyword == null ? null : TokenFactory.tokenFromKeyword(abstractKeyword), TokenFactory.tokenFromKeyword(Keyword.CLASS), identifier3(name), typeParameters, extendsClause, withClause, implementsClause, TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
-  static ClassTypeAlias classTypeAlias(String name, TypeParameterList typeParameters, Keyword abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause) => new ClassTypeAlias(null, null, TokenFactory.token(Keyword.CLASS), identifier3(name), typeParameters, TokenFactory.token3(TokenType.EQ), abstractKeyword == null ? null : TokenFactory.token(abstractKeyword), superclass, withClause, implementsClause, TokenFactory.token3(TokenType.SEMICOLON));
+  static ClassTypeAlias classTypeAlias(String name, TypeParameterList typeParameters, Keyword abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause) => new ClassTypeAlias(null, null, TokenFactory.tokenFromKeyword(Keyword.CLASS), identifier3(name), typeParameters, TokenFactory.tokenFromType(TokenType.EQ), abstractKeyword == null ? null : TokenFactory.tokenFromKeyword(abstractKeyword), superclass, withClause, implementsClause, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static CompilationUnit compilationUnit() => compilationUnit8(null, null, null);
 
@@ -389,67 +389,67 @@
 
   static CompilationUnit compilationUnit7(String scriptTag, List<Directive> directives) => compilationUnit8(scriptTag, list(directives), null);
 
-  static CompilationUnit compilationUnit8(String scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations) => new CompilationUnit(TokenFactory.token3(TokenType.EOF), scriptTag == null ? null : AstFactory.scriptTag(scriptTag), directives == null ? new List<Directive>() : directives, declarations == null ? new List<CompilationUnitMember>() : declarations, TokenFactory.token3(TokenType.EOF));
+  static CompilationUnit compilationUnit8(String scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations) => new CompilationUnit(TokenFactory.tokenFromType(TokenType.EOF), scriptTag == null ? null : AstFactory.scriptTag(scriptTag), directives == null ? new List<Directive>() : directives, declarations == null ? new List<CompilationUnitMember>() : declarations, TokenFactory.tokenFromType(TokenType.EOF));
 
-  static ConditionalExpression conditionalExpression(Expression condition, Expression thenExpression, Expression elseExpression) => new ConditionalExpression(condition, TokenFactory.token3(TokenType.QUESTION), thenExpression, TokenFactory.token3(TokenType.COLON), elseExpression);
+  static ConditionalExpression conditionalExpression(Expression condition, Expression thenExpression, Expression elseExpression) => new ConditionalExpression(condition, TokenFactory.tokenFromType(TokenType.QUESTION), thenExpression, TokenFactory.tokenFromType(TokenType.COLON), elseExpression);
 
-  static ConstructorDeclaration constructorDeclaration(Identifier returnType, String name, FormalParameterList parameters, List<ConstructorInitializer> initializers) => new ConstructorDeclaration(null, null, TokenFactory.token(Keyword.EXTERNAL), null, null, returnType, name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name), parameters, initializers == null || initializers.isEmpty ? null : TokenFactory.token3(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, emptyFunctionBody());
+  static ConstructorDeclaration constructorDeclaration(Identifier returnType, String name, FormalParameterList parameters, List<ConstructorInitializer> initializers) => new ConstructorDeclaration(null, null, TokenFactory.tokenFromKeyword(Keyword.EXTERNAL), null, null, returnType, name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name), parameters, initializers == null || initializers.isEmpty ? null : TokenFactory.tokenFromType(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, emptyFunctionBody());
 
-  static ConstructorDeclaration constructorDeclaration2(Keyword constKeyword, Keyword factoryKeyword, Identifier returnType, String name, FormalParameterList parameters, List<ConstructorInitializer> initializers, FunctionBody body) => new ConstructorDeclaration(null, null, null, constKeyword == null ? null : TokenFactory.token(constKeyword), factoryKeyword == null ? null : TokenFactory.token(factoryKeyword), returnType, name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name), parameters, initializers == null || initializers.isEmpty ? null : TokenFactory.token3(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, body);
+  static ConstructorDeclaration constructorDeclaration2(Keyword constKeyword, Keyword factoryKeyword, Identifier returnType, String name, FormalParameterList parameters, List<ConstructorInitializer> initializers, FunctionBody body) => new ConstructorDeclaration(null, null, null, constKeyword == null ? null : TokenFactory.tokenFromKeyword(constKeyword), factoryKeyword == null ? null : TokenFactory.tokenFromKeyword(factoryKeyword), returnType, name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name), parameters, initializers == null || initializers.isEmpty ? null : TokenFactory.tokenFromType(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, body);
 
-  static ConstructorFieldInitializer constructorFieldInitializer(bool prefixedWithThis, String fieldName, Expression expression) => new ConstructorFieldInitializer(prefixedWithThis ? TokenFactory.token(Keyword.THIS) : null, prefixedWithThis ? TokenFactory.token3(TokenType.PERIOD) : null, identifier3(fieldName), TokenFactory.token3(TokenType.EQ), expression);
+  static ConstructorFieldInitializer constructorFieldInitializer(bool prefixedWithThis, String fieldName, Expression expression) => new ConstructorFieldInitializer(prefixedWithThis ? TokenFactory.tokenFromKeyword(Keyword.THIS) : null, prefixedWithThis ? TokenFactory.tokenFromType(TokenType.PERIOD) : null, identifier3(fieldName), TokenFactory.tokenFromType(TokenType.EQ), expression);
 
-  static ConstructorName constructorName(TypeName type, String name) => new ConstructorName(type, name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name));
+  static ConstructorName constructorName(TypeName type, String name) => new ConstructorName(type, name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name));
 
-  static ContinueStatement continueStatement() => new ContinueStatement(TokenFactory.token(Keyword.CONTINUE), null, TokenFactory.token3(TokenType.SEMICOLON));
+  static ContinueStatement continueStatement() => new ContinueStatement(TokenFactory.tokenFromKeyword(Keyword.CONTINUE), null, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static ContinueStatement continueStatement2(String label) => new ContinueStatement(TokenFactory.token(Keyword.CONTINUE), identifier3(label), TokenFactory.token3(TokenType.SEMICOLON));
+  static ContinueStatement continueStatement2(String label) => new ContinueStatement(TokenFactory.tokenFromKeyword(Keyword.CONTINUE), identifier3(label), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static DeclaredIdentifier declaredIdentifier(Keyword keyword, String identifier) => declaredIdentifier2(keyword, null, identifier);
 
-  static DeclaredIdentifier declaredIdentifier2(Keyword keyword, TypeName type, String identifier) => new DeclaredIdentifier(null, null, keyword == null ? null : TokenFactory.token(keyword), type, identifier3(identifier));
+  static DeclaredIdentifier declaredIdentifier2(Keyword keyword, TypeName type, String identifier) => new DeclaredIdentifier(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, identifier3(identifier));
 
   static DeclaredIdentifier declaredIdentifier3(String identifier) => declaredIdentifier2(null, null, identifier);
 
   static DeclaredIdentifier declaredIdentifier4(TypeName type, String identifier) => declaredIdentifier2(null, type, identifier);
 
-  static DoStatement doStatement(Statement body, Expression condition) => new DoStatement(TokenFactory.token(Keyword.DO), body, TokenFactory.token(Keyword.WHILE), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.SEMICOLON));
+  static DoStatement doStatement(Statement body, Expression condition) => new DoStatement(TokenFactory.tokenFromKeyword(Keyword.DO), body, TokenFactory.tokenFromKeyword(Keyword.WHILE), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), condition, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static DoubleLiteral doubleLiteral(double value) => new DoubleLiteral(TokenFactory.token2(value.toString()), value);
+  static DoubleLiteral doubleLiteral(double value) => new DoubleLiteral(TokenFactory.tokenFromString(value.toString()), value);
 
-  static EmptyFunctionBody emptyFunctionBody() => new EmptyFunctionBody(TokenFactory.token3(TokenType.SEMICOLON));
+  static EmptyFunctionBody emptyFunctionBody() => new EmptyFunctionBody(TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static EmptyStatement emptyStatement() => new EmptyStatement(TokenFactory.token3(TokenType.SEMICOLON));
+  static EmptyStatement emptyStatement() => new EmptyStatement(TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static ExportDirective exportDirective(List<Annotation> metadata, String uri, List<Combinator> combinators) => new ExportDirective(null, metadata, TokenFactory.token(Keyword.EXPORT), string2(uri), list(combinators), TokenFactory.token3(TokenType.SEMICOLON));
+  static ExportDirective exportDirective(List<Annotation> metadata, String uri, List<Combinator> combinators) => new ExportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.EXPORT), string2(uri), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static ExportDirective exportDirective2(String uri, List<Combinator> combinators) => exportDirective(new List<Annotation>(), uri, combinators);
 
-  static ExpressionFunctionBody expressionFunctionBody(Expression expression) => new ExpressionFunctionBody(TokenFactory.token3(TokenType.FUNCTION), expression, TokenFactory.token3(TokenType.SEMICOLON));
+  static ExpressionFunctionBody expressionFunctionBody(Expression expression) => new ExpressionFunctionBody(TokenFactory.tokenFromType(TokenType.FUNCTION), expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static ExpressionStatement expressionStatement(Expression expression) => new ExpressionStatement(expression, TokenFactory.token3(TokenType.SEMICOLON));
+  static ExpressionStatement expressionStatement(Expression expression) => new ExpressionStatement(expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static ExtendsClause extendsClause(TypeName type) => new ExtendsClause(TokenFactory.token(Keyword.EXTENDS), type);
+  static ExtendsClause extendsClause(TypeName type) => new ExtendsClause(TokenFactory.tokenFromKeyword(Keyword.EXTENDS), type);
 
-  static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new FieldDeclaration(null, null, isStatic ? TokenFactory.token(Keyword.STATIC) : null, variableDeclarationList(keyword, type, variables), TokenFactory.token3(TokenType.SEMICOLON));
+  static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new FieldDeclaration(null, null, isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null, variableDeclarationList(keyword, type, variables), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword, List<VariableDeclaration> variables) => fieldDeclaration(isStatic, keyword, null, variables);
 
-  static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName type, String identifier) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.token(keyword), type, TokenFactory.token(Keyword.THIS), TokenFactory.token3(TokenType.PERIOD), identifier3(identifier), null);
+  static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName type, String identifier) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(identifier), null);
 
-  static FieldFormalParameter fieldFormalParameter2(Keyword keyword, TypeName type, String identifier, FormalParameterList parameterList) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.token(keyword), type, TokenFactory.token(Keyword.THIS), TokenFactory.token3(TokenType.PERIOD), identifier3(identifier), parameterList);
+  static FieldFormalParameter fieldFormalParameter2(Keyword keyword, TypeName type, String identifier, FormalParameterList parameterList) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(identifier), parameterList);
 
   static FieldFormalParameter fieldFormalParameter3(String identifier) => fieldFormalParameter(null, null, identifier);
 
-  static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expression iterator, Statement body) => new ForEachStatement.con1(TokenFactory.token(Keyword.FOR), TokenFactory.token3(TokenType.OPEN_PAREN), loopVariable, TokenFactory.token(Keyword.IN), iterator, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+  static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expression iterator, Statement body) => new ForEachStatement.con1(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), loopVariable, TokenFactory.tokenFromKeyword(Keyword.IN), iterator, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
 
-  static FormalParameterList formalParameterList(List<FormalParameter> parameters) => new FormalParameterList(TokenFactory.token3(TokenType.OPEN_PAREN), list(parameters), null, null, TokenFactory.token3(TokenType.CLOSE_PAREN));
+  static FormalParameterList formalParameterList(List<FormalParameter> parameters) => new FormalParameterList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(parameters), null, null, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
-  static ForStatement forStatement(Expression initialization, Expression condition, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory.token(Keyword.FOR), TokenFactory.token3(TokenType.OPEN_PAREN), null, initialization, TokenFactory.token3(TokenType.SEMICOLON), condition, TokenFactory.token3(TokenType.SEMICOLON), updaters, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+  static ForStatement forStatement(Expression initialization, Expression condition, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), null, initialization, TokenFactory.tokenFromType(TokenType.SEMICOLON), condition, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
 
-  static ForStatement forStatement2(VariableDeclarationList variableList, Expression condition, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory.token(Keyword.FOR), TokenFactory.token3(TokenType.OPEN_PAREN), variableList, null, TokenFactory.token3(TokenType.SEMICOLON), condition, TokenFactory.token3(TokenType.SEMICOLON), updaters, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+  static ForStatement forStatement2(VariableDeclarationList variableList, Expression condition, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), variableList, null, TokenFactory.tokenFromType(TokenType.SEMICOLON), condition, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
 
-  static FunctionDeclaration functionDeclaration(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclaration(null, null, null, type, keyword == null ? null : TokenFactory.token(keyword), identifier3(name), functionExpression);
+  static FunctionDeclaration functionDeclaration(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclaration(null, null, null, type, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), identifier3(name), functionExpression);
 
   static FunctionDeclarationStatement functionDeclarationStatement(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclarationStatement(functionDeclaration(type, keyword, name, functionExpression));
 
@@ -461,59 +461,59 @@
 
   static FunctionTypedFormalParameter functionTypedFormalParameter(TypeName returnType, String identifier, List<FormalParameter> parameters) => new FunctionTypedFormalParameter(null, null, returnType, identifier3(identifier), formalParameterList(parameters));
 
-  static HideCombinator hideCombinator(List<SimpleIdentifier> identifiers) => new HideCombinator(TokenFactory.token2("hide"), list(identifiers));
+  static HideCombinator hideCombinator(List<SimpleIdentifier> identifiers) => new HideCombinator(TokenFactory.tokenFromString("hide"), list(identifiers));
 
   static HideCombinator hideCombinator2(List<String> identifiers) {
     List<SimpleIdentifier> identifierList = new List<SimpleIdentifier>();
     for (String identifier in identifiers) {
       identifierList.add(identifier3(identifier));
     }
-    return new HideCombinator(TokenFactory.token2("hide"), identifierList);
+    return new HideCombinator(TokenFactory.tokenFromString("hide"), identifierList);
   }
 
-  static PrefixedIdentifier identifier(SimpleIdentifier prefix, SimpleIdentifier identifier) => new PrefixedIdentifier(prefix, TokenFactory.token3(TokenType.PERIOD), identifier);
+  static PrefixedIdentifier identifier(SimpleIdentifier prefix, SimpleIdentifier identifier) => new PrefixedIdentifier(prefix, TokenFactory.tokenFromType(TokenType.PERIOD), identifier);
 
-  static SimpleIdentifier identifier3(String lexeme) => new SimpleIdentifier(TokenFactory.token4(TokenType.IDENTIFIER, lexeme));
+  static SimpleIdentifier identifier3(String lexeme) => new SimpleIdentifier(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, lexeme));
 
-  static PrefixedIdentifier identifier4(String prefix, SimpleIdentifier identifier) => new PrefixedIdentifier(identifier3(prefix), TokenFactory.token3(TokenType.PERIOD), identifier);
+  static PrefixedIdentifier identifier4(String prefix, SimpleIdentifier identifier) => new PrefixedIdentifier(identifier3(prefix), TokenFactory.tokenFromType(TokenType.PERIOD), identifier);
 
-  static PrefixedIdentifier identifier5(String prefix, String identifier) => new PrefixedIdentifier(identifier3(prefix), TokenFactory.token3(TokenType.PERIOD), identifier3(identifier));
+  static PrefixedIdentifier identifier5(String prefix, String identifier) => new PrefixedIdentifier(identifier3(prefix), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(identifier));
 
   static IfStatement ifStatement(Expression condition, Statement thenStatement) => ifStatement2(condition, thenStatement, null);
 
-  static IfStatement ifStatement2(Expression condition, Statement thenStatement, Statement elseStatement) => new IfStatement(TokenFactory.token(Keyword.IF), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), thenStatement, elseStatement == null ? null : TokenFactory.token(Keyword.ELSE), elseStatement);
+  static IfStatement ifStatement2(Expression condition, Statement thenStatement, Statement elseStatement) => new IfStatement(TokenFactory.tokenFromKeyword(Keyword.IF), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), condition, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), thenStatement, elseStatement == null ? null : TokenFactory.tokenFromKeyword(Keyword.ELSE), elseStatement);
 
-  static ImplementsClause implementsClause(List<TypeName> types) => new ImplementsClause(TokenFactory.token(Keyword.IMPLEMENTS), list(types));
+  static ImplementsClause implementsClause(List<TypeName> types) => new ImplementsClause(TokenFactory.tokenFromKeyword(Keyword.IMPLEMENTS), list(types));
 
-  static ImportDirective importDirective(List<Annotation> metadata, String uri, String prefix, List<Combinator> combinators) => new ImportDirective(null, metadata, TokenFactory.token(Keyword.IMPORT), string2(uri), prefix == null ? null : TokenFactory.token(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.token3(TokenType.SEMICOLON));
+  static ImportDirective importDirective(List<Annotation> metadata, String uri, String prefix, List<Combinator> combinators) => new ImportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.IMPORT), string2(uri), prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static ImportDirective importDirective2(String uri, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, prefix, combinators);
 
-  static IndexExpression indexExpression(Expression array, Expression index) => new IndexExpression.forTarget(array, TokenFactory.token3(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.token3(TokenType.CLOSE_SQUARE_BRACKET));
+  static IndexExpression indexExpression(Expression array, Expression index) => new IndexExpression.forTarget(array, TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
-  static InstanceCreationExpression instanceCreationExpression(Keyword keyword, ConstructorName name, List<Expression> arguments) => new InstanceCreationExpression(keyword == null ? null : TokenFactory.token(keyword), name, argumentList(arguments));
+  static InstanceCreationExpression instanceCreationExpression(Keyword keyword, ConstructorName name, List<Expression> arguments) => new InstanceCreationExpression(keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), name, argumentList(arguments));
 
   static InstanceCreationExpression instanceCreationExpression2(Keyword keyword, TypeName type, List<Expression> arguments) => instanceCreationExpression3(keyword, type, null, arguments);
 
-  static InstanceCreationExpression instanceCreationExpression3(Keyword keyword, TypeName type, String identifier, List<Expression> arguments) => instanceCreationExpression(keyword, new ConstructorName(type, identifier == null ? null : TokenFactory.token3(TokenType.PERIOD), identifier == null ? null : identifier3(identifier)), arguments);
+  static InstanceCreationExpression instanceCreationExpression3(Keyword keyword, TypeName type, String identifier, List<Expression> arguments) => instanceCreationExpression(keyword, new ConstructorName(type, identifier == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), identifier == null ? null : identifier3(identifier)), arguments);
 
-  static IntegerLiteral integer(int value) => new IntegerLiteral(TokenFactory.token4(TokenType.INT, value.toString()), value);
+  static IntegerLiteral integer(int value) => new IntegerLiteral(TokenFactory.tokenFromTypeAndString(TokenType.INT, value.toString()), value);
 
-  static InterpolationExpression interpolationExpression(Expression expression) => new InterpolationExpression(TokenFactory.token3(TokenType.STRING_INTERPOLATION_EXPRESSION), expression, TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+  static InterpolationExpression interpolationExpression(Expression expression) => new InterpolationExpression(TokenFactory.tokenFromType(TokenType.STRING_INTERPOLATION_EXPRESSION), expression, TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
-  static InterpolationExpression interpolationExpression2(String identifier) => new InterpolationExpression(TokenFactory.token3(TokenType.STRING_INTERPOLATION_IDENTIFIER), identifier3(identifier), null);
+  static InterpolationExpression interpolationExpression2(String identifier) => new InterpolationExpression(TokenFactory.tokenFromType(TokenType.STRING_INTERPOLATION_IDENTIFIER), identifier3(identifier), null);
 
-  static InterpolationString interpolationString(String contents, String value) => new InterpolationString(TokenFactory.token2(contents), value);
+  static InterpolationString interpolationString(String contents, String value) => new InterpolationString(TokenFactory.tokenFromString(contents), value);
 
-  static IsExpression isExpression(Expression expression, bool negated, TypeName type) => new IsExpression(expression, TokenFactory.token(Keyword.IS), negated ? TokenFactory.token3(TokenType.BANG) : null, type);
+  static IsExpression isExpression(Expression expression, bool negated, TypeName type) => new IsExpression(expression, TokenFactory.tokenFromKeyword(Keyword.IS), negated ? TokenFactory.tokenFromType(TokenType.BANG) : null, type);
 
-  static Label label(SimpleIdentifier label) => new Label(label, TokenFactory.token3(TokenType.COLON));
+  static Label label(SimpleIdentifier label) => new Label(label, TokenFactory.tokenFromType(TokenType.COLON));
 
   static Label label2(String label) => AstFactory.label(identifier3(label));
 
   static LabeledStatement labeledStatement(List<Label> labels, Statement statement) => new LabeledStatement(labels, statement);
 
-  static LibraryDirective libraryDirective(List<Annotation> metadata, LibraryIdentifier libraryName) => new LibraryDirective(null, metadata, TokenFactory.token(Keyword.LIBRARY), libraryName, TokenFactory.token3(TokenType.SEMICOLON));
+  static LibraryDirective libraryDirective(List<Annotation> metadata, LibraryIdentifier libraryName) => new LibraryDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.LIBRARY), libraryName, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static LibraryDirective libraryDirective2(String libraryName) => libraryDirective(new List<Annotation>(), libraryIdentifier2([libraryName]));
 
@@ -537,19 +537,19 @@
 
   static ListLiteral listLiteral(List<Expression> elements) => listLiteral2(null, null, elements);
 
-  static ListLiteral listLiteral2(Keyword keyword, TypeArgumentList typeArguments, List<Expression> elements) => new ListLiteral(keyword == null ? null : TokenFactory.token(keyword), null, TokenFactory.token3(TokenType.OPEN_SQUARE_BRACKET), list(elements), TokenFactory.token3(TokenType.CLOSE_SQUARE_BRACKET));
+  static ListLiteral listLiteral2(Keyword keyword, TypeArgumentList typeArguments, List<Expression> elements) => new ListLiteral(keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), null, TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), list(elements), TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
-  static MapLiteral mapLiteral(Keyword keyword, TypeArgumentList typeArguments, List<MapLiteralEntry> entries) => new MapLiteral(keyword == null ? null : TokenFactory.token(keyword), typeArguments, TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(entries), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+  static MapLiteral mapLiteral(Keyword keyword, TypeArgumentList typeArguments, List<MapLiteralEntry> entries) => new MapLiteral(keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), typeArguments, TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET), list(entries), TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static MapLiteral mapLiteral2(List<MapLiteralEntry> entries) => mapLiteral(null, null, entries);
 
-  static MapLiteralEntry mapLiteralEntry(String key, Expression value) => new MapLiteralEntry(string2(key), TokenFactory.token3(TokenType.COLON), value);
+  static MapLiteralEntry mapLiteralEntry(String key, Expression value) => new MapLiteralEntry(string2(key), TokenFactory.tokenFromType(TokenType.COLON), value);
 
-  static MethodDeclaration methodDeclaration(Keyword modifier, TypeName returnType, Keyword property, Keyword operator, SimpleIdentifier name, FormalParameterList parameters) => new MethodDeclaration(null, null, TokenFactory.token(Keyword.EXTERNAL), modifier == null ? null : TokenFactory.token(modifier), returnType, property == null ? null : TokenFactory.token(property), operator == null ? null : TokenFactory.token(operator), name, parameters, emptyFunctionBody());
+  static MethodDeclaration methodDeclaration(Keyword modifier, TypeName returnType, Keyword property, Keyword operator, SimpleIdentifier name, FormalParameterList parameters) => new MethodDeclaration(null, null, TokenFactory.tokenFromKeyword(Keyword.EXTERNAL), modifier == null ? null : TokenFactory.tokenFromKeyword(modifier), returnType, property == null ? null : TokenFactory.tokenFromKeyword(property), operator == null ? null : TokenFactory.tokenFromKeyword(operator), name, parameters, emptyFunctionBody());
 
-  static MethodDeclaration methodDeclaration2(Keyword modifier, TypeName returnType, Keyword property, Keyword operator, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) => new MethodDeclaration(null, null, null, modifier == null ? null : TokenFactory.token(modifier), returnType, property == null ? null : TokenFactory.token(property), operator == null ? null : TokenFactory.token(operator), name, parameters, body);
+  static MethodDeclaration methodDeclaration2(Keyword modifier, TypeName returnType, Keyword property, Keyword operator, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) => new MethodDeclaration(null, null, null, modifier == null ? null : TokenFactory.tokenFromKeyword(modifier), returnType, property == null ? null : TokenFactory.tokenFromKeyword(property), operator == null ? null : TokenFactory.tokenFromKeyword(operator), name, parameters, body);
 
-  static MethodInvocation methodInvocation(Expression target, String methodName, List<Expression> arguments) => new MethodInvocation(target, target == null ? null : TokenFactory.token3(TokenType.PERIOD), identifier3(methodName), argumentList(arguments));
+  static MethodInvocation methodInvocation(Expression target, String methodName, List<Expression> arguments) => new MethodInvocation(target, target == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(methodName), argumentList(arguments));
 
   static MethodInvocation methodInvocation2(String methodName, List<Expression> arguments) => methodInvocation(null, methodName, arguments);
 
@@ -557,59 +557,59 @@
 
   static NamedExpression namedExpression2(String label, Expression expression) => namedExpression(label2(label), expression);
 
-  static DefaultFormalParameter namedFormalParameter(NormalFormalParameter parameter, Expression expression) => new DefaultFormalParameter(parameter, ParameterKind.NAMED, expression == null ? null : TokenFactory.token3(TokenType.COLON), expression);
+  static DefaultFormalParameter namedFormalParameter(NormalFormalParameter parameter, Expression expression) => new DefaultFormalParameter(parameter, ParameterKind.NAMED, expression == null ? null : TokenFactory.tokenFromType(TokenType.COLON), expression);
 
-  static NativeClause nativeClause(String nativeCode) => new NativeClause(TokenFactory.token2("native"), string2(nativeCode));
+  static NativeClause nativeClause(String nativeCode) => new NativeClause(TokenFactory.tokenFromString("native"), string2(nativeCode));
 
-  static NativeFunctionBody nativeFunctionBody(String nativeMethodName) => new NativeFunctionBody(TokenFactory.token2("native"), string2(nativeMethodName), TokenFactory.token3(TokenType.SEMICOLON));
+  static NativeFunctionBody nativeFunctionBody(String nativeMethodName) => new NativeFunctionBody(TokenFactory.tokenFromString("native"), string2(nativeMethodName), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static NullLiteral nullLiteral() => new NullLiteral(TokenFactory.token(Keyword.NULL));
+  static NullLiteral nullLiteral() => new NullLiteral(TokenFactory.tokenFromKeyword(Keyword.NULL));
 
-  static ParenthesizedExpression parenthesizedExpression(Expression expression) => new ParenthesizedExpression(TokenFactory.token3(TokenType.OPEN_PAREN), expression, TokenFactory.token3(TokenType.CLOSE_PAREN));
+  static ParenthesizedExpression parenthesizedExpression(Expression expression) => new ParenthesizedExpression(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), expression, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
-  static PartDirective partDirective(List<Annotation> metadata, String url) => new PartDirective(null, metadata, TokenFactory.token(Keyword.PART), string2(url), TokenFactory.token3(TokenType.SEMICOLON));
+  static PartDirective partDirective(List<Annotation> metadata, String url) => new PartDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.PART), string2(url), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static PartDirective partDirective2(String url) => partDirective(new List<Annotation>(), url);
 
   static PartOfDirective partOfDirective(LibraryIdentifier libraryName) => partOfDirective2(new List<Annotation>(), libraryName);
 
-  static PartOfDirective partOfDirective2(List<Annotation> metadata, LibraryIdentifier libraryName) => new PartOfDirective(null, metadata, TokenFactory.token(Keyword.PART), TokenFactory.token2("of"), libraryName, TokenFactory.token3(TokenType.SEMICOLON));
+  static PartOfDirective partOfDirective2(List<Annotation> metadata, LibraryIdentifier libraryName) => new PartOfDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.PART), TokenFactory.tokenFromString("of"), libraryName, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static DefaultFormalParameter positionalFormalParameter(NormalFormalParameter parameter, Expression expression) => new DefaultFormalParameter(parameter, ParameterKind.POSITIONAL, expression == null ? null : TokenFactory.token3(TokenType.EQ), expression);
+  static DefaultFormalParameter positionalFormalParameter(NormalFormalParameter parameter, Expression expression) => new DefaultFormalParameter(parameter, ParameterKind.POSITIONAL, expression == null ? null : TokenFactory.tokenFromType(TokenType.EQ), expression);
 
-  static PostfixExpression postfixExpression(Expression expression, TokenType operator) => new PostfixExpression(expression, TokenFactory.token3(operator));
+  static PostfixExpression postfixExpression(Expression expression, TokenType operator) => new PostfixExpression(expression, TokenFactory.tokenFromType(operator));
 
-  static PrefixExpression prefixExpression(TokenType operator, Expression expression) => new PrefixExpression(TokenFactory.token3(operator), expression);
+  static PrefixExpression prefixExpression(TokenType operator, Expression expression) => new PrefixExpression(TokenFactory.tokenFromType(operator), expression);
 
-  static PropertyAccess propertyAccess(Expression target, SimpleIdentifier propertyName) => new PropertyAccess(target, TokenFactory.token3(TokenType.PERIOD), propertyName);
+  static PropertyAccess propertyAccess(Expression target, SimpleIdentifier propertyName) => new PropertyAccess(target, TokenFactory.tokenFromType(TokenType.PERIOD), propertyName);
 
-  static PropertyAccess propertyAccess2(Expression target, String propertyName) => new PropertyAccess(target, TokenFactory.token3(TokenType.PERIOD), identifier3(propertyName));
+  static PropertyAccess propertyAccess2(Expression target, String propertyName) => new PropertyAccess(target, TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(propertyName));
 
   static RedirectingConstructorInvocation redirectingConstructorInvocation(List<Expression> arguments) => redirectingConstructorInvocation2(null, arguments);
 
-  static RedirectingConstructorInvocation redirectingConstructorInvocation2(String constructorName, List<Expression> arguments) => new RedirectingConstructorInvocation(TokenFactory.token(Keyword.THIS), constructorName == null ? null : TokenFactory.token3(TokenType.PERIOD), constructorName == null ? null : identifier3(constructorName), argumentList(arguments));
+  static RedirectingConstructorInvocation redirectingConstructorInvocation2(String constructorName, List<Expression> arguments) => new RedirectingConstructorInvocation(TokenFactory.tokenFromKeyword(Keyword.THIS), constructorName == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), constructorName == null ? null : identifier3(constructorName), argumentList(arguments));
 
-  static RethrowExpression rethrowExpression() => new RethrowExpression(TokenFactory.token(Keyword.RETHROW));
+  static RethrowExpression rethrowExpression() => new RethrowExpression(TokenFactory.tokenFromKeyword(Keyword.RETHROW));
 
   static ReturnStatement returnStatement() => returnStatement2(null);
 
-  static ReturnStatement returnStatement2(Expression expression) => new ReturnStatement(TokenFactory.token(Keyword.RETURN), expression, TokenFactory.token3(TokenType.SEMICOLON));
+  static ReturnStatement returnStatement2(Expression expression) => new ReturnStatement(TokenFactory.tokenFromKeyword(Keyword.RETURN), expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static ScriptTag scriptTag(String scriptTag) => new ScriptTag(TokenFactory.token2(scriptTag));
+  static ScriptTag scriptTag(String scriptTag) => new ScriptTag(TokenFactory.tokenFromString(scriptTag));
 
-  static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) => new ShowCombinator(TokenFactory.token2("show"), list(identifiers));
+  static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) => new ShowCombinator(TokenFactory.tokenFromString("show"), list(identifiers));
 
   static ShowCombinator showCombinator2(List<String> identifiers) {
     List<SimpleIdentifier> identifierList = new List<SimpleIdentifier>();
     for (String identifier in identifiers) {
       identifierList.add(identifier3(identifier));
     }
-    return new ShowCombinator(TokenFactory.token2("show"), identifierList);
+    return new ShowCombinator(TokenFactory.tokenFromString("show"), identifierList);
   }
 
   static SimpleFormalParameter simpleFormalParameter(Keyword keyword, String parameterName) => simpleFormalParameter2(keyword, null, parameterName);
 
-  static SimpleFormalParameter simpleFormalParameter2(Keyword keyword, TypeName type, String parameterName) => new SimpleFormalParameter(null, null, keyword == null ? null : TokenFactory.token(keyword), type, identifier3(parameterName));
+  static SimpleFormalParameter simpleFormalParameter2(Keyword keyword, TypeName type, String parameterName) => new SimpleFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, identifier3(parameterName));
 
   static SimpleFormalParameter simpleFormalParameter3(String parameterName) => simpleFormalParameter2(null, null, parameterName);
 
@@ -617,51 +617,51 @@
 
   static StringInterpolation string(List<InterpolationElement> elements) => new StringInterpolation(list(elements));
 
-  static SimpleStringLiteral string2(String content) => new SimpleStringLiteral(TokenFactory.token2("'${content}'"), content);
+  static SimpleStringLiteral string2(String content) => new SimpleStringLiteral(TokenFactory.tokenFromString("'${content}'"), content);
 
   static SuperConstructorInvocation superConstructorInvocation(List<Expression> arguments) => superConstructorInvocation2(null, arguments);
 
-  static SuperConstructorInvocation superConstructorInvocation2(String name, List<Expression> arguments) => new SuperConstructorInvocation(TokenFactory.token(Keyword.SUPER), name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name), argumentList(arguments));
+  static SuperConstructorInvocation superConstructorInvocation2(String name, List<Expression> arguments) => new SuperConstructorInvocation(TokenFactory.tokenFromKeyword(Keyword.SUPER), name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name), argumentList(arguments));
 
-  static SuperExpression superExpression() => new SuperExpression(TokenFactory.token(Keyword.SUPER));
+  static SuperExpression superExpression() => new SuperExpression(TokenFactory.tokenFromKeyword(Keyword.SUPER));
 
   static SwitchCase switchCase(Expression expression, List<Statement> statements) => switchCase2(new List<Label>(), expression, statements);
 
-  static SwitchCase switchCase2(List<Label> labels, Expression expression, List<Statement> statements) => new SwitchCase(labels, TokenFactory.token(Keyword.CASE), expression, TokenFactory.token3(TokenType.COLON), list(statements));
+  static SwitchCase switchCase2(List<Label> labels, Expression expression, List<Statement> statements) => new SwitchCase(labels, TokenFactory.tokenFromKeyword(Keyword.CASE), expression, TokenFactory.tokenFromType(TokenType.COLON), list(statements));
 
-  static SwitchDefault switchDefault(List<Label> labels, List<Statement> statements) => new SwitchDefault(labels, TokenFactory.token(Keyword.DEFAULT), TokenFactory.token3(TokenType.COLON), list(statements));
+  static SwitchDefault switchDefault(List<Label> labels, List<Statement> statements) => new SwitchDefault(labels, TokenFactory.tokenFromKeyword(Keyword.DEFAULT), TokenFactory.tokenFromType(TokenType.COLON), list(statements));
 
   static SwitchDefault switchDefault2(List<Statement> statements) => switchDefault(new List<Label>(), statements);
 
-  static SwitchStatement switchStatement(Expression expression, List<SwitchMember> members) => new SwitchStatement(TokenFactory.token(Keyword.SWITCH), TokenFactory.token3(TokenType.OPEN_PAREN), expression, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+  static SwitchStatement switchStatement(Expression expression, List<SwitchMember> members) => new SwitchStatement(TokenFactory.tokenFromKeyword(Keyword.SWITCH), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), expression, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static SymbolLiteral symbolLiteral(List<String> components) {
     List<Token> identifierList = new List<Token>();
     for (String component in components) {
-      identifierList.add(TokenFactory.token4(TokenType.IDENTIFIER, component));
+      identifierList.add(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, component));
     }
-    return new SymbolLiteral(TokenFactory.token3(TokenType.HASH), new List.from(identifierList));
+    return new SymbolLiteral(TokenFactory.tokenFromType(TokenType.HASH), new List.from(identifierList));
   }
 
-  static ThisExpression thisExpression() => new ThisExpression(TokenFactory.token(Keyword.THIS));
+  static ThisExpression thisExpression() => new ThisExpression(TokenFactory.tokenFromKeyword(Keyword.THIS));
 
   static ThrowExpression throwExpression() => throwExpression2(null);
 
-  static ThrowExpression throwExpression2(Expression expression) => new ThrowExpression(TokenFactory.token(Keyword.THROW), expression);
+  static ThrowExpression throwExpression2(Expression expression) => new ThrowExpression(TokenFactory.tokenFromKeyword(Keyword.THROW), expression);
 
-  static TopLevelVariableDeclaration topLevelVariableDeclaration(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new TopLevelVariableDeclaration(null, null, variableDeclarationList(keyword, type, variables), TokenFactory.token3(TokenType.SEMICOLON));
+  static TopLevelVariableDeclaration topLevelVariableDeclaration(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new TopLevelVariableDeclaration(null, null, variableDeclarationList(keyword, type, variables), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static TopLevelVariableDeclaration topLevelVariableDeclaration2(Keyword keyword, List<VariableDeclaration> variables) => new TopLevelVariableDeclaration(null, null, variableDeclarationList(keyword, null, variables), TokenFactory.token3(TokenType.SEMICOLON));
+  static TopLevelVariableDeclaration topLevelVariableDeclaration2(Keyword keyword, List<VariableDeclaration> variables) => new TopLevelVariableDeclaration(null, null, variableDeclarationList(keyword, null, variables), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static TryStatement tryStatement(Block body, Block finallyClause) => tryStatement3(body, new List<CatchClause>(), finallyClause);
 
   static TryStatement tryStatement2(Block body, List<CatchClause> catchClauses) => tryStatement3(body, list(catchClauses), null);
 
-  static TryStatement tryStatement3(Block body, List<CatchClause> catchClauses, Block finallyClause) => new TryStatement(TokenFactory.token(Keyword.TRY), body, catchClauses, finallyClause == null ? null : TokenFactory.token(Keyword.FINALLY), finallyClause);
+  static TryStatement tryStatement3(Block body, List<CatchClause> catchClauses, Block finallyClause) => new TryStatement(TokenFactory.tokenFromKeyword(Keyword.TRY), body, catchClauses, finallyClause == null ? null : TokenFactory.tokenFromKeyword(Keyword.FINALLY), finallyClause);
 
-  static FunctionTypeAlias typeAlias(TypeName returnType, String name, TypeParameterList typeParameters, FormalParameterList parameters) => new FunctionTypeAlias(null, null, TokenFactory.token(Keyword.TYPEDEF), returnType, identifier3(name), typeParameters, parameters, TokenFactory.token3(TokenType.SEMICOLON));
+  static FunctionTypeAlias typeAlias(TypeName returnType, String name, TypeParameterList typeParameters, FormalParameterList parameters) => new FunctionTypeAlias(null, null, TokenFactory.tokenFromKeyword(Keyword.TYPEDEF), returnType, identifier3(name), typeParameters, parameters, TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static TypeArgumentList typeArgumentList(List<TypeName> typeNames) => new TypeArgumentList(TokenFactory.token3(TokenType.LT), list(typeNames), TokenFactory.token3(TokenType.GT));
+  static TypeArgumentList typeArgumentList(List<TypeName> typeNames) => new TypeArgumentList(TokenFactory.tokenFromType(TokenType.LT), list(typeNames), TokenFactory.tokenFromType(TokenType.GT));
 
   /**
    * Create a type name whose name has been resolved to the given element and whose type has been
@@ -696,31 +696,31 @@
 
   static TypeParameter typeParameter(String name) => new TypeParameter(null, null, identifier3(name), null, null);
 
-  static TypeParameter typeParameter2(String name, TypeName bound) => new TypeParameter(null, null, identifier3(name), TokenFactory.token(Keyword.EXTENDS), bound);
+  static TypeParameter typeParameter2(String name, TypeName bound) => new TypeParameter(null, null, identifier3(name), TokenFactory.tokenFromKeyword(Keyword.EXTENDS), bound);
 
   static TypeParameterList typeParameterList(List<String> typeNames) {
     List<TypeParameter> typeParameters = new List<TypeParameter>();
     for (String typeName in typeNames) {
       typeParameters.add(typeParameter(typeName));
     }
-    return new TypeParameterList(TokenFactory.token3(TokenType.LT), typeParameters, TokenFactory.token3(TokenType.GT));
+    return new TypeParameterList(TokenFactory.tokenFromType(TokenType.LT), typeParameters, TokenFactory.tokenFromType(TokenType.GT));
   }
 
   static VariableDeclaration variableDeclaration(String name) => new VariableDeclaration(null, null, identifier3(name), null, null);
 
-  static VariableDeclaration variableDeclaration2(String name, Expression initializer) => new VariableDeclaration(null, null, identifier3(name), TokenFactory.token3(TokenType.EQ), initializer);
+  static VariableDeclaration variableDeclaration2(String name, Expression initializer) => new VariableDeclaration(null, null, identifier3(name), TokenFactory.tokenFromType(TokenType.EQ), initializer);
 
-  static VariableDeclarationList variableDeclarationList(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new VariableDeclarationList(null, null, keyword == null ? null : TokenFactory.token(keyword), type, list(variables));
+  static VariableDeclarationList variableDeclarationList(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new VariableDeclarationList(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, list(variables));
 
   static VariableDeclarationList variableDeclarationList2(Keyword keyword, List<VariableDeclaration> variables) => variableDeclarationList(keyword, null, variables);
 
-  static VariableDeclarationStatement variableDeclarationStatement(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new VariableDeclarationStatement(variableDeclarationList(keyword, type, variables), TokenFactory.token3(TokenType.SEMICOLON));
+  static VariableDeclarationStatement variableDeclarationStatement(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new VariableDeclarationStatement(variableDeclarationList(keyword, type, variables), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static VariableDeclarationStatement variableDeclarationStatement2(Keyword keyword, List<VariableDeclaration> variables) => variableDeclarationStatement(keyword, null, variables);
 
-  static WhileStatement whileStatement(Expression condition, Statement body) => new WhileStatement(TokenFactory.token(Keyword.WHILE), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+  static WhileStatement whileStatement(Expression condition, Statement body) => new WhileStatement(TokenFactory.tokenFromKeyword(Keyword.WHILE), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), condition, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
 
-  static WithClause withClause(List<TypeName> types) => new WithClause(TokenFactory.token(Keyword.WITH), list(types));
+  static WithClause withClause(List<TypeName> types) => new WithClause(TokenFactory.tokenFromKeyword(Keyword.WITH), list(types));
 }
 
 class SimpleIdentifierTest extends ParserTestCase {
@@ -1082,7 +1082,7 @@
     List<AstNode> nodes = new List<AstNode>();
     BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_BreadthFirstVisitorTest_testIt(nodes);
     visitor.visitAllNodes(unit);
-    EngineTestCase.assertSize(59, nodes);
+    EngineTestCase.assertSizeOfList(59, nodes);
     EngineTestCase.assertInstanceOf((obj) => obj is CompilationUnit, CompilationUnit, nodes[0]);
     EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, nodes[2]);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionDeclaration, FunctionDeclaration, nodes[3]);
@@ -1119,14 +1119,14 @@
     NodeList<AstNode> list = new NodeList<AstNode>(parent);
     list.insert(0, secondNode);
     list.insert(0, firstNode);
-    EngineTestCase.assertSize(2, list);
+    EngineTestCase.assertSizeOfList(2, list);
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(secondNode, list[1]);
     JUnitTestCase.assertSame(parent, firstNode.parent);
     JUnitTestCase.assertSame(parent, secondNode.parent);
     AstNode thirdNode = AstFactory.booleanLiteral(false);
     list.insert(1, thirdNode);
-    EngineTestCase.assertSize(3, list);
+    EngineTestCase.assertSizeOfList(3, list);
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(thirdNode, list[1]);
     JUnitTestCase.assertSame(secondNode, list[2]);
@@ -1162,7 +1162,7 @@
     firstNodes.add(secondNode);
     NodeList<AstNode> list = new NodeList<AstNode>(parent);
     list.addAll(firstNodes);
-    EngineTestCase.assertSize(2, list);
+    EngineTestCase.assertSizeOfList(2, list);
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(secondNode, list[1]);
     JUnitTestCase.assertSame(parent, firstNode.parent);
@@ -1173,7 +1173,7 @@
     secondNodes.add(thirdNode);
     secondNodes.add(fourthNode);
     list.addAll(secondNodes);
-    EngineTestCase.assertSize(4, list);
+    EngineTestCase.assertSizeOfList(4, list);
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(secondNode, list[1]);
     JUnitTestCase.assertSame(thirdNode, list[2]);
@@ -1188,7 +1188,7 @@
     AstNode owner = AstFactory.argumentList([]);
     NodeList<AstNode> list = NodeList.create(owner);
     JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSize(0, list);
+    EngineTestCase.assertSizeOfList(0, list);
     JUnitTestCase.assertSame(owner, list.owner);
   }
 
@@ -1196,7 +1196,7 @@
     AstNode owner = AstFactory.argumentList([]);
     NodeList<AstNode> list = new NodeList<AstNode>(owner);
     JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSize(0, list);
+    EngineTestCase.assertSizeOfList(0, list);
     JUnitTestCase.assertSame(owner, list.owner);
   }
 
@@ -1253,7 +1253,7 @@
     nodes.add(thirdNode);
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     list.addAll(nodes);
-    EngineTestCase.assertSize(3, list);
+    EngineTestCase.assertSizeOfList(3, list);
     JUnitTestCase.assertEquals(0, list.indexOf(firstNode));
     JUnitTestCase.assertEquals(1, list.indexOf(secondNode));
     JUnitTestCase.assertEquals(2, list.indexOf(thirdNode));
@@ -1271,9 +1271,9 @@
     nodes.add(thirdNode);
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     list.addAll(nodes);
-    EngineTestCase.assertSize(3, list);
+    EngineTestCase.assertSizeOfList(3, list);
     JUnitTestCase.assertSame(secondNode, list.removeAt(1));
-    EngineTestCase.assertSize(2, list);
+    EngineTestCase.assertSizeOfList(2, list);
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(thirdNode, list[1]);
   }
@@ -1306,10 +1306,10 @@
     nodes.add(thirdNode);
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     list.addAll(nodes);
-    EngineTestCase.assertSize(3, list);
+    EngineTestCase.assertSizeOfList(3, list);
     AstNode fourthNode = AstFactory.integer(0);
     JUnitTestCase.assertSame(secondNode, javaListSet(list, 1, fourthNode));
-    EngineTestCase.assertSize(3, list);
+    EngineTestCase.assertSizeOfList(3, list);
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(fourthNode, list[1]);
     JUnitTestCase.assertSame(thirdNode, list[2]);
@@ -1936,40 +1936,40 @@
 
 class SimpleStringLiteralTest extends ParserTestCase {
   void test_getValueOffset() {
-    JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.token2("'X'"), "X").valueOffset);
-    JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.token2("\"X\""), "X").valueOffset);
-    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.token2("\"\"\"X\"\"\""), "X").valueOffset);
-    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.token2("'''X'''"), "X").valueOffset);
-    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.token2("r'X'"), "X").valueOffset);
-    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.token2("r\"X\""), "X").valueOffset);
-    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.token2("r\"\"\"X\"\"\""), "X").valueOffset);
-    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.token2("r'''X'''"), "X").valueOffset);
+    JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").valueOffset);
+    JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").valueOffset);
+    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").valueOffset);
+    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").valueOffset);
+    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").valueOffset);
+    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").valueOffset);
+    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").valueOffset);
+    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").valueOffset);
   }
 
   void test_isMultiline() {
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("'X'"), "X").isMultiline);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("r'X'"), "X").isMultiline);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("\"X\""), "X").isMultiline);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("r\"X\""), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("'''X'''"), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("r'''X'''"), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("\"\"\"X\"\"\""), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("r\"\"\"X\"\"\""), "X").isMultiline);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isMultiline);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").isMultiline);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").isMultiline);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").isMultiline);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").isMultiline);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").isMultiline);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isMultiline);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isMultiline);
   }
 
   void test_isRaw() {
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("'X'"), "X").isRaw);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("\"X\""), "X").isRaw);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("\"\"\"X\"\"\""), "X").isRaw);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.token2("'''X'''"), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("r'X'"), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("r\"X\""), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("r\"\"\"X\"\"\""), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.token2("r'''X'''"), "X").isRaw);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isRaw);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").isRaw);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isRaw);
+    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").isRaw);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").isRaw);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").isRaw);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isRaw);
+    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").isRaw);
   }
 
   void test_simple() {
-    Token token = TokenFactory.token2("'value'");
+    Token token = TokenFactory.tokenFromString("'value'");
     SimpleStringLiteral stringLiteral = new SimpleStringLiteral(token, "value");
     JUnitTestCase.assertSame(token, stringLiteral.literal);
     JUnitTestCase.assertSame(token, stringLiteral.beginToken);
@@ -2193,7 +2193,7 @@
   }
 
   void test_visitComment() {
-    assertSource("", Comment.createBlockComment(<Token> [TokenFactory.token2("/* comment */")]));
+    assertSource("", Comment.createBlockComment(<Token> [TokenFactory.tokenFromString("/* comment */")]));
   }
 
   void test_visitCommentReference() {
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 3f464fd..f09cd7e 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -352,9 +352,9 @@
     LibraryElement library = ElementFactory.library(context, "foo");
     context.setContents(library.definingCompilationUnit.source, "sdfsdff");
     // Assert that we are not up to date if the target has an old time stamp.
-    JUnitTestCase.assertFalse(library.isUpToDate2(0));
+    JUnitTestCase.assertFalse(library.isUpToDate(0));
     // Assert that we are up to date with a target modification time in the future.
-    JUnitTestCase.assertTrue(library.isUpToDate2(JavaSystem.currentTimeMillis() + 1000));
+    JUnitTestCase.assertTrue(library.isUpToDate(JavaSystem.currentTimeMillis() + 1000));
   }
 
   void test_setImports() {
@@ -714,13 +714,13 @@
     classE.interfaces = <InterfaceType> [classB.type, classD.type];
     // D
     Set<InterfaceType> superinterfacesOfD = InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    EngineTestCase.assertSize3(3, superinterfacesOfD);
+    EngineTestCase.assertSizeOfSet(3, superinterfacesOfD);
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classC.type));
     // E
     Set<InterfaceType> superinterfacesOfE = InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    EngineTestCase.assertSize3(5, superinterfacesOfE);
+    EngineTestCase.assertSizeOfSet(5, superinterfacesOfE);
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classB.type));
@@ -737,13 +737,13 @@
     classE.interfaces = <InterfaceType> [classD.type];
     // D
     Set<InterfaceType> superinterfacesOfD = InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    EngineTestCase.assertSize3(3, superinterfacesOfD);
+    EngineTestCase.assertSizeOfSet(3, superinterfacesOfD);
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfD.contains(classC.type));
     // E
     Set<InterfaceType> superinterfacesOfE = InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    EngineTestCase.assertSize3(5, superinterfacesOfE);
+    EngineTestCase.assertSizeOfSet(5, superinterfacesOfE);
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classB.type));
@@ -756,7 +756,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    EngineTestCase.assertSize3(2, superinterfacesOfB);
+    EngineTestCase.assertSizeOfSet(2, superinterfacesOfB);
   }
 
   void test_computeSuperinterfaceSet_singleInterfacePath() {
@@ -767,16 +767,16 @@
     classC.interfaces = <InterfaceType> [classB.type];
     // A
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    EngineTestCase.assertSize3(1, superinterfacesOfA);
+    EngineTestCase.assertSizeOfSet(1, superinterfacesOfA);
     JUnitTestCase.assertTrue(superinterfacesOfA.contains(ElementFactory.object.type));
     // B
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    EngineTestCase.assertSize3(2, superinterfacesOfB);
+    EngineTestCase.assertSizeOfSet(2, superinterfacesOfB);
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(classA.type));
     // C
     Set<InterfaceType> superinterfacesOfC = InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    EngineTestCase.assertSize3(3, superinterfacesOfC);
+    EngineTestCase.assertSizeOfSet(3, superinterfacesOfC);
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
@@ -795,16 +795,16 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     // A
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    EngineTestCase.assertSize3(1, superinterfacesOfA);
+    EngineTestCase.assertSizeOfSet(1, superinterfacesOfA);
     JUnitTestCase.assertTrue(superinterfacesOfA.contains(ElementFactory.object.type));
     // B
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    EngineTestCase.assertSize3(2, superinterfacesOfB);
+    EngineTestCase.assertSizeOfSet(2, superinterfacesOfB);
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfB.contains(classA.type));
     // C
     Set<InterfaceType> superinterfacesOfC = InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    EngineTestCase.assertSize3(3, superinterfacesOfC);
+    EngineTestCase.assertSizeOfSet(3, superinterfacesOfC);
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(ElementFactory.object.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
@@ -2918,33 +2918,33 @@
   void test_hasNonFinalField_false_const() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, true, classA.type)];
-    JUnitTestCase.assertFalse(classA.hasNonFinalField());
+    JUnitTestCase.assertFalse(classA.hasNonFinalField);
   }
 
   void test_hasNonFinalField_false_final() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, true, false, classA.type)];
-    JUnitTestCase.assertFalse(classA.hasNonFinalField());
+    JUnitTestCase.assertFalse(classA.hasNonFinalField);
   }
 
   void test_hasNonFinalField_false_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
-    JUnitTestCase.assertFalse(classA.hasNonFinalField());
+    JUnitTestCase.assertFalse(classA.hasNonFinalField);
   }
 
   void test_hasNonFinalField_true_immediate() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
-    JUnitTestCase.assertTrue(classA.hasNonFinalField());
+    JUnitTestCase.assertTrue(classA.hasNonFinalField);
   }
 
   void test_hasNonFinalField_true_inherited() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
-    JUnitTestCase.assertTrue(classB.hasNonFinalField());
+    JUnitTestCase.assertTrue(classB.hasNonFinalField);
   }
 
   void test_lookUpGetter_declared() {
@@ -3370,7 +3370,7 @@
   void test_getNamedParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(AstFactory.identifier3("f")));
     Map<String, Type2> types = type.namedParameterTypes;
-    EngineTestCase.assertSize2(0, types);
+    EngineTestCase.assertSizeOfMap(0, types);
   }
 
   void test_getNormalParameterTypes() {
@@ -3764,7 +3764,7 @@
     EngineTestCase.assertLength(1, optionalParameters);
     JUnitTestCase.assertEquals(argumentType, optionalParameters[0]);
     Map<String, Type2> namedParameters = result.namedParameterTypes;
-    EngineTestCase.assertSize2(1, namedParameters);
+    EngineTestCase.assertSizeOfMap(1, namedParameters);
     JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
   }
 
@@ -3792,7 +3792,7 @@
     EngineTestCase.assertLength(1, optionalParameters);
     JUnitTestCase.assertEquals(optionalParameterType, optionalParameters[0]);
     Map<String, Type2> namedParameters = result.namedParameterTypes;
-    EngineTestCase.assertSize2(1, namedParameters);
+    EngineTestCase.assertSizeOfMap(1, namedParameters);
     JUnitTestCase.assertEquals(namedParameterType, namedParameters[namedParameterName]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 7915d4e..db2264c 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -389,25 +389,25 @@
   void test_parseArgumentList_empty() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "()", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSize(0, arguments);
+    EngineTestCase.assertSizeOfList(0, arguments);
   }
 
   void test_parseArgumentList_mixed() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "(w, x, y: y, z: z)", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSize(4, arguments);
+    EngineTestCase.assertSizeOfList(4, arguments);
   }
 
   void test_parseArgumentList_noNamed() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "(x, y, z)", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSize(3, arguments);
+    EngineTestCase.assertSizeOfList(3, arguments);
   }
 
   void test_parseArgumentList_onlyNamed() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "(x: x, y: y)", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSize(2, arguments);
+    EngineTestCase.assertSizeOfList(2, arguments);
   }
 
   void test_parseAssertStatement() {
@@ -425,7 +425,7 @@
     JUnitTestCase.assertNotNull(invocation.function);
     ArgumentList argumentList = invocation.argumentList;
     JUnitTestCase.assertNotNull(argumentList);
-    EngineTestCase.assertSize(1, argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
@@ -456,7 +456,7 @@
     JUnitTestCase.assertEquals("x", invocation.methodName.name);
     ArgumentList argumentList = invocation.argumentList;
     JUnitTestCase.assertNotNull(argumentList);
-    EngineTestCase.assertSize(1, argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
@@ -560,14 +560,14 @@
   void test_parseBlock_empty() {
     Block block = ParserTestCase.parse4("parseBlock", "{}", []);
     JUnitTestCase.assertNotNull(block.leftBracket);
-    EngineTestCase.assertSize(0, block.statements);
+    EngineTestCase.assertSizeOfList(0, block.statements);
     JUnitTestCase.assertNotNull(block.rightBracket);
   }
 
   void test_parseBlock_nonEmpty() {
     Block block = ParserTestCase.parse4("parseBlock", "{;}", []);
     JUnitTestCase.assertNotNull(block.leftBracket);
-    EngineTestCase.assertSize(1, block.statements);
+    EngineTestCase.assertSizeOfList(1, block.statements);
     JUnitTestCase.assertNotNull(block.rightBracket);
   }
 
@@ -605,7 +605,7 @@
     JUnitTestCase.assertNotNull(section.period);
     JUnitTestCase.assertNotNull(section.methodName);
     JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSize(1, section.argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
   }
 
   void test_parseCascadeSection_p() {
@@ -644,21 +644,21 @@
     JUnitTestCase.assertNotNull(section.period);
     JUnitTestCase.assertNotNull(section.methodName);
     JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSize(1, section.argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
   }
 
   void test_parseCascadeSection_paa() {
     FunctionExpressionInvocation section = ParserTestCase.parse4("parseCascadeSection", "..a(b)(c)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSize(1, section.argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
   }
 
   void test_parseCascadeSection_paapaa() {
     FunctionExpressionInvocation section = ParserTestCase.parse4("parseCascadeSection", "..a(b)(c).d(e)(f)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSize(1, section.argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
   }
 
   void test_parseCascadeSection_pap() {
@@ -671,7 +671,7 @@
   void test_parseClassDeclaration_abstract() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [
         emptyCommentAndMetadata(),
-        TokenFactory.token(Keyword.ABSTRACT)], "class A {}");
+        TokenFactory.tokenFromKeyword(Keyword.ABSTRACT)], "class A {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
     JUnitTestCase.assertNotNull(declaration.abstractKeyword);
     JUnitTestCase.assertNull(declaration.extendsClause);
@@ -679,7 +679,7 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
@@ -693,7 +693,7 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
@@ -707,7 +707,7 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
@@ -721,7 +721,7 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
@@ -737,7 +737,7 @@
     JUnitTestCase.assertNotNull(declaration.withClause);
     JUnitTestCase.assertNull(declaration.implementsClause);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
   }
 
@@ -752,7 +752,7 @@
     JUnitTestCase.assertNotNull(declaration.withClause);
     JUnitTestCase.assertNotNull(declaration.implementsClause);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
   }
 
@@ -765,7 +765,7 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
@@ -789,7 +789,7 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(1, declaration.members);
+    EngineTestCase.assertSizeOfList(1, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
@@ -827,10 +827,10 @@
     JUnitTestCase.assertNotNull(declaration.classKeyword);
     JUnitTestCase.assertNotNull(declaration.leftBracket);
     JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNotNull(declaration.typeParameters);
-    EngineTestCase.assertSize(1, declaration.typeParameters.typeParameters);
+    EngineTestCase.assertSizeOfList(1, declaration.typeParameters.typeParameters);
   }
 
   void test_parseClassMember_constructor_withInitializers() {
@@ -845,18 +845,18 @@
     JUnitTestCase.assertNotNull(constructor.parameters);
     JUnitTestCase.assertNull(constructor.period);
     JUnitTestCase.assertNotNull(constructor.returnType);
-    EngineTestCase.assertSize(1, constructor.initializers);
+    EngineTestCase.assertSizeOfList(1, constructor.initializers);
   }
 
   void test_parseClassMember_field_instance_prefixedType() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "p.A f;");
     JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSize(0, field.metadata);
+    EngineTestCase.assertSizeOfList(0, field.metadata);
     JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSize(1, variables);
+    EngineTestCase.assertSizeOfList(1, variables);
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
@@ -864,12 +864,12 @@
   void test_parseClassMember_field_namedGet() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var get;");
     JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSize(0, field.metadata);
+    EngineTestCase.assertSizeOfList(0, field.metadata);
     JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSize(1, variables);
+    EngineTestCase.assertSizeOfList(1, variables);
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
@@ -877,12 +877,12 @@
   void test_parseClassMember_field_namedOperator() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator;");
     JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSize(0, field.metadata);
+    EngineTestCase.assertSizeOfList(0, field.metadata);
     JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSize(1, variables);
+    EngineTestCase.assertSizeOfList(1, variables);
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
@@ -890,12 +890,12 @@
   void test_parseClassMember_field_namedOperator_withAssignment() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator = (5);");
     JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSize(0, field.metadata);
+    EngineTestCase.assertSizeOfList(0, field.metadata);
     JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSize(1, variables);
+    EngineTestCase.assertSizeOfList(1, variables);
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
     JUnitTestCase.assertNotNull(variable.initializer);
@@ -904,12 +904,12 @@
   void test_parseClassMember_field_namedSet() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var set;");
     JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSize(0, field.metadata);
+    EngineTestCase.assertSizeOfList(0, field.metadata);
     JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSize(1, variables);
+    EngineTestCase.assertSizeOfList(1, variables);
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
@@ -1118,7 +1118,7 @@
     JUnitTestCase.assertNull(constructor.name);
     JUnitTestCase.assertNotNull(constructor.parameters);
     JUnitTestCase.assertNotNull(constructor.separator);
-    EngineTestCase.assertSize(0, constructor.initializers);
+    EngineTestCase.assertSizeOfList(0, constructor.initializers);
     JUnitTestCase.assertNotNull(constructor.redirectedConstructor);
     JUnitTestCase.assertNotNull(constructor.body);
   }
@@ -1133,13 +1133,13 @@
     JUnitTestCase.assertNull(constructor.name);
     JUnitTestCase.assertNotNull(constructor.parameters);
     JUnitTestCase.assertNotNull(constructor.separator);
-    EngineTestCase.assertSize(0, constructor.initializers);
+    EngineTestCase.assertSizeOfList(0, constructor.initializers);
     JUnitTestCase.assertNotNull(constructor.redirectedConstructor);
     JUnitTestCase.assertNotNull(constructor.body);
   }
 
   void test_parseClassTypeAlias() {
-    Token token = TokenFactory.token(Keyword.CLASS);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B;");
     JUnitTestCase.assertNotNull(classTypeAlias.keyword);
     JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
@@ -1152,7 +1152,7 @@
   }
 
   void test_parseClassTypeAlias_abstract() {
-    Token token = TokenFactory.token(Keyword.CLASS);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = abstract B;");
     JUnitTestCase.assertNotNull(classTypeAlias.keyword);
     JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
@@ -1165,7 +1165,7 @@
   }
 
   void test_parseClassTypeAlias_implements() {
-    Token token = TokenFactory.token(Keyword.CLASS);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B implements C;");
     JUnitTestCase.assertNotNull(classTypeAlias.keyword);
     JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
@@ -1178,7 +1178,7 @@
   }
 
   void test_parseClassTypeAlias_with() {
-    Token token = TokenFactory.token(Keyword.CLASS);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C;");
     JUnitTestCase.assertNotNull(classTypeAlias.keyword);
     JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
@@ -1191,7 +1191,7 @@
   }
 
   void test_parseClassTypeAlias_with_implements() {
-    Token token = TokenFactory.token(Keyword.CLASS);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C implements D;");
     JUnitTestCase.assertNotNull(classTypeAlias.keyword);
     JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
@@ -1205,98 +1205,98 @@
 
   void test_parseCombinators_h() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "hide a;", []);
-    EngineTestCase.assertSize(1, combinators);
+    EngineTestCase.assertSizeOfList(1, combinators);
     HideCombinator combinator = combinators[0] as HideCombinator;
     JUnitTestCase.assertNotNull(combinator);
     JUnitTestCase.assertNotNull(combinator.keyword);
-    EngineTestCase.assertSize(1, combinator.hiddenNames);
+    EngineTestCase.assertSizeOfList(1, combinator.hiddenNames);
   }
 
   void test_parseCombinators_hs() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "hide a show b;", []);
-    EngineTestCase.assertSize(2, combinators);
+    EngineTestCase.assertSizeOfList(2, combinators);
     HideCombinator hideCombinator = combinators[0] as HideCombinator;
     JUnitTestCase.assertNotNull(hideCombinator);
     JUnitTestCase.assertNotNull(hideCombinator.keyword);
-    EngineTestCase.assertSize(1, hideCombinator.hiddenNames);
+    EngineTestCase.assertSizeOfList(1, hideCombinator.hiddenNames);
     ShowCombinator showCombinator = combinators[1] as ShowCombinator;
     JUnitTestCase.assertNotNull(showCombinator);
     JUnitTestCase.assertNotNull(showCombinator.keyword);
-    EngineTestCase.assertSize(1, showCombinator.shownNames);
+    EngineTestCase.assertSizeOfList(1, showCombinator.shownNames);
   }
 
   void test_parseCombinators_hshs() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "hide a show b hide c show d;", []);
-    EngineTestCase.assertSize(4, combinators);
+    EngineTestCase.assertSizeOfList(4, combinators);
   }
 
   void test_parseCombinators_s() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "show a;", []);
-    EngineTestCase.assertSize(1, combinators);
+    EngineTestCase.assertSizeOfList(1, combinators);
     ShowCombinator combinator = combinators[0] as ShowCombinator;
     JUnitTestCase.assertNotNull(combinator);
     JUnitTestCase.assertNotNull(combinator.keyword);
-    EngineTestCase.assertSize(1, combinator.shownNames);
+    EngineTestCase.assertSizeOfList(1, combinator.shownNames);
   }
 
   void test_parseCommentAndMetadata_c() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(0, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(0, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_cmc() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(1, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(1, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_cmcm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ @B void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(2, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_cmm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ @A @B void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(2, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_m() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A void", []);
     JUnitTestCase.assertNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(1, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(1, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_mcm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A /** 1 */ @B void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(2, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_mcmc() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A /** 1 */ @B /** 2 */ void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(2, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_mm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A @B(x) void", []);
     JUnitTestCase.assertNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(2, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_none() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "void", []);
     JUnitTestCase.assertNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(0, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(0, commentAndMetadata.metadata);
   }
 
   void test_parseCommentAndMetadata_singleLine() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", EngineTestCase.createSource(["/// 1", "/// 2", "void"]), []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSize(0, commentAndMetadata.metadata);
+    EngineTestCase.assertSizeOfList(0, commentAndMetadata.metadata);
   }
 
   void test_parseCommentReference_new_prefixed() {
@@ -1356,7 +1356,7 @@
   void test_parseCommentReferences_multiLine() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(2, references);
+    EngineTestCase.assertSizeOfList(2, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1370,7 +1370,7 @@
   void test_parseCommentReferences_notClosed_noIdentifier() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [ some text", 5)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1381,7 +1381,7 @@
   void test_parseCommentReferences_notClosed_withIdentifier() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [namePrefix some text", 5)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1394,7 +1394,7 @@
         new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
         new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(3, references);
+    EngineTestCase.assertSizeOfList(3, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1412,7 +1412,7 @@
   void test_parseCommentReferences_skipCodeBlock_bracketed() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [:xxx [a] yyy:] [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1422,7 +1422,7 @@
   void test_parseCommentReferences_skipCodeBlock_spaces() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/**\n *     a[i]\n * xxx [i] zzz\n */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1432,7 +1432,7 @@
   void test_parseCommentReferences_skipLinkDefinition() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a]: http://www.google.com (Google) [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1442,7 +1442,7 @@
   void test_parseCommentReferences_skipLinked() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a](http://www.google.com) [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1452,7 +1452,7 @@
   void test_parseCommentReferences_skipReferenceLink() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertNotNull(reference.identifier);
@@ -1462,8 +1462,8 @@
   void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "abstract<dynamic> _abstract = new abstract.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnit_builtIn_asFunctionName() {
@@ -1487,71 +1487,71 @@
   void test_parseCompilationUnit_directives_multiple() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "library l;\npart 'a.dart';", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(2, unit.directives);
-    EngineTestCase.assertSize(0, unit.declarations);
+    EngineTestCase.assertSizeOfList(2, unit.directives);
+    EngineTestCase.assertSizeOfList(0, unit.declarations);
   }
 
   void test_parseCompilationUnit_directives_single() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "library l;", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(1, unit.directives);
-    EngineTestCase.assertSize(0, unit.declarations);
+    EngineTestCase.assertSizeOfList(1, unit.directives);
+    EngineTestCase.assertSizeOfList(0, unit.declarations);
   }
 
   void test_parseCompilationUnit_empty() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(0, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(0, unit.declarations);
   }
 
   void test_parseCompilationUnit_exportAsPrefix() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "export.A _export = new export.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnit_exportAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "export<dynamic> _export = new export.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "operator<dynamic> _operator = new operator.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnit_script() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "#! /bin/dart", []);
     JUnitTestCase.assertNotNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(0, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(0, unit.declarations);
   }
 
   void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
     ParserTestCase._parseFunctionBodies = false;
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "f() { '\${n}'; }", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnit_topLevelDeclaration() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "class A {}", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnit_typedefAsPrefix() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "typedef.A _typedef = new typedef.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSize(0, unit.directives);
-    EngineTestCase.assertSize(1, unit.declarations);
+    EngineTestCase.assertSizeOfList(0, unit.directives);
+    EngineTestCase.assertSizeOfList(1, unit.declarations);
   }
 
   void test_parseCompilationUnitMember_abstractAsPrefix() {
@@ -1563,7 +1563,7 @@
   void test_parseCompilationUnitMember_class() {
     ClassDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class A {}");
     JUnitTestCase.assertEquals("A", declaration.name.name);
-    EngineTestCase.assertSize(0, declaration.members);
+    EngineTestCase.assertSizeOfList(0, declaration.members);
   }
 
   void test_parseCompilationUnitMember_classTypeAlias() {
@@ -1685,7 +1685,7 @@
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C<E> = S<E> with M<E> implements I<E>;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
     JUnitTestCase.assertEquals("C", typeAlias.name.name);
-    EngineTestCase.assertSize(1, typeAlias.typeParameters.typeParameters);
+    EngineTestCase.assertSizeOfList(1, typeAlias.typeParameters.typeParameters);
     JUnitTestCase.assertNotNull(typeAlias.equals);
     JUnitTestCase.assertNull(typeAlias.abstractKeyword);
     JUnitTestCase.assertEquals("S", typeAlias.superclass.name.name);
@@ -1723,7 +1723,7 @@
   void test_parseCompilationUnitMember_typedef() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "typedef F();");
     JUnitTestCase.assertEquals("F", typeAlias.name.name);
-    EngineTestCase.assertSize(0, typeAlias.parameters.parameters);
+    EngineTestCase.assertSizeOfList(0, typeAlias.parameters.parameters);
   }
 
   void test_parseCompilationUnitMember_variable() {
@@ -1769,7 +1769,7 @@
     JUnitTestCase.assertNotNull(literal.constKeyword);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.elements);
+    EngineTestCase.assertSizeOfList(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -1778,14 +1778,14 @@
     JUnitTestCase.assertNotNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.elements);
+    EngineTestCase.assertSizeOfList(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
   void test_parseConstExpression_mapLiteral_typed() {
     MapLiteral literal = ParserTestCase.parse4("parseConstExpression", "const <A, B> {}", []);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.entries);
+    EngineTestCase.assertSizeOfList(0, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
     JUnitTestCase.assertNotNull(literal.typeArguments);
   }
@@ -1793,7 +1793,7 @@
   void test_parseConstExpression_mapLiteral_untyped() {
     MapLiteral literal = ParserTestCase.parse4("parseConstExpression", "const {}", []);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.entries);
+    EngineTestCase.assertSizeOfList(0, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
     JUnitTestCase.assertNull(literal.typeArguments);
   }
@@ -1865,7 +1865,7 @@
     ExportDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.keyword);
     JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSize(0, directive.combinators);
+    EngineTestCase.assertSizeOfList(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -1875,7 +1875,7 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNull(directive.asToken);
     JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSize(0, directive.combinators);
+    EngineTestCase.assertSizeOfList(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -1914,7 +1914,7 @@
     JUnitTestCase.assertTrue(comment.isDocumentation);
     JUnitTestCase.assertFalse(comment.isEndOfLine);
     NodeList<CommentReference> references = comment.references;
-    EngineTestCase.assertSize(1, references);
+    EngineTestCase.assertSizeOfList(1, references);
     CommentReference reference = references[0];
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertEquals(5, reference.offset);
@@ -1963,7 +1963,7 @@
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' hide A, B;");
     JUnitTestCase.assertNotNull(directive.keyword);
     JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSize(1, directive.combinators);
+    EngineTestCase.assertSizeOfList(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -1971,7 +1971,7 @@
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' hide A show B;");
     JUnitTestCase.assertNotNull(directive.keyword);
     JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSize(2, directive.combinators);
+    EngineTestCase.assertSizeOfList(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -1979,7 +1979,7 @@
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.keyword);
     JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSize(0, directive.combinators);
+    EngineTestCase.assertSizeOfList(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -1987,7 +1987,7 @@
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' show A, B;");
     JUnitTestCase.assertNotNull(directive.keyword);
     JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSize(1, directive.combinators);
+    EngineTestCase.assertSizeOfList(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -1995,7 +1995,7 @@
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' show B hide A;");
     JUnitTestCase.assertNotNull(directive.keyword);
     JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSize(2, directive.combinators);
+    EngineTestCase.assertSizeOfList(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -2024,7 +2024,7 @@
     JUnitTestCase.assertNotNull(expression.body);
     ArgumentList list = invocation.argumentList;
     JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSize(1, list.arguments);
+    EngineTestCase.assertSizeOfList(1, list.arguments);
   }
 
   void test_parseExpression_superMethodInvocation() {
@@ -2036,12 +2036,12 @@
 
   void test_parseExpressionList_multiple() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, 3", []);
-    EngineTestCase.assertSize(3, result);
+    EngineTestCase.assertSizeOfList(3, result);
   }
 
   void test_parseExpressionList_single() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1", []);
-    EngineTestCase.assertSize(1, result);
+    EngineTestCase.assertSizeOfList(1, result);
   }
 
   void test_parseExpressionWithoutCascade_assign() {
@@ -2262,7 +2262,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "()", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(0, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(0, parameterList.parameters);
     JUnitTestCase.assertNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2271,7 +2271,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "({A a : 1, B b, C c : 3})", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(3, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(3, parameterList.parameters);
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2280,7 +2280,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "({A a})", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(1, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2289,7 +2289,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a, B b, C c)", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(3, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(3, parameterList.parameters);
     JUnitTestCase.assertNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2298,7 +2298,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a, {B b})", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(2, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(2, parameterList.parameters);
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2307,7 +2307,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a, [B b])", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(2, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(2, parameterList.parameters);
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2316,7 +2316,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a)", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(1, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
     JUnitTestCase.assertNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2325,7 +2325,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "([A a = null, B b, C c = null])", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(3, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(3, parameterList.parameters);
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2334,7 +2334,7 @@
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "([A a = null])", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
     JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSize(1, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
@@ -2356,7 +2356,7 @@
     JUnitTestCase.assertNotNull(statement.forKeyword);
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     JUnitTestCase.assertNotNull(statement.loopVariable);
-    EngineTestCase.assertSize(1, statement.loopVariable.metadata);
+    EngineTestCase.assertSizeOfList(1, statement.loopVariable.metadata);
     JUnitTestCase.assertNull(statement.identifier);
     JUnitTestCase.assertNotNull(statement.inKeyword);
     JUnitTestCase.assertNotNull(statement.iterator);
@@ -2397,7 +2397,7 @@
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNotNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(0, statement.updaters);
+    EngineTestCase.assertSizeOfList(0, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2411,7 +2411,7 @@
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNotNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(1, statement.updaters);
+    EngineTestCase.assertSizeOfList(1, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2425,7 +2425,7 @@
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNotNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(1, statement.updaters);
+    EngineTestCase.assertSizeOfList(1, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2436,13 +2436,13 @@
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     VariableDeclarationList variables = statement.variables;
     JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSize(0, variables.metadata);
-    EngineTestCase.assertSize(1, variables.variables);
+    EngineTestCase.assertSizeOfList(0, variables.metadata);
+    EngineTestCase.assertSizeOfList(1, variables.variables);
     JUnitTestCase.assertNull(statement.initialization);
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(0, statement.updaters);
+    EngineTestCase.assertSizeOfList(0, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2453,13 +2453,13 @@
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     VariableDeclarationList variables = statement.variables;
     JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSize(1, variables.metadata);
-    EngineTestCase.assertSize(1, variables.variables);
+    EngineTestCase.assertSizeOfList(1, variables.metadata);
+    EngineTestCase.assertSizeOfList(1, variables.variables);
     JUnitTestCase.assertNull(statement.initialization);
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(0, statement.updaters);
+    EngineTestCase.assertSizeOfList(0, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2470,12 +2470,12 @@
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     VariableDeclarationList variables = statement.variables;
     JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSize(1, variables.variables);
+    EngineTestCase.assertSizeOfList(1, variables.variables);
     JUnitTestCase.assertNull(statement.initialization);
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNotNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(0, statement.updaters);
+    EngineTestCase.assertSizeOfList(0, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2486,12 +2486,12 @@
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     VariableDeclarationList variables = statement.variables;
     JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSize(1, variables.variables);
+    EngineTestCase.assertSizeOfList(1, variables.variables);
     JUnitTestCase.assertNull(statement.initialization);
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNotNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(1, statement.updaters);
+    EngineTestCase.assertSizeOfList(1, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2502,12 +2502,12 @@
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     VariableDeclarationList variables = statement.variables;
     JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSize(2, variables.variables);
+    EngineTestCase.assertSizeOfList(2, variables.variables);
     JUnitTestCase.assertNull(statement.initialization);
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNotNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(2, statement.updaters);
+    EngineTestCase.assertSizeOfList(2, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2518,12 +2518,12 @@
     JUnitTestCase.assertNotNull(statement.leftParenthesis);
     VariableDeclarationList variables = statement.variables;
     JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSize(1, variables.variables);
+    EngineTestCase.assertSizeOfList(1, variables.variables);
     JUnitTestCase.assertNull(statement.initialization);
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(1, statement.updaters);
+    EngineTestCase.assertSizeOfList(1, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2537,7 +2537,7 @@
     JUnitTestCase.assertNotNull(statement.leftSeparator);
     JUnitTestCase.assertNull(statement.condition);
     JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSize(1, statement.updaters);
+    EngineTestCase.assertSizeOfList(1, statement.updaters);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
@@ -2661,7 +2661,7 @@
 
   void test_parseGetter_static() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    Token staticKeyword = TokenFactory.token(Keyword.STATIC);
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     MethodDeclaration method = ParserTestCase.parse("parseGetter", <Object> [
         commentAndMetadata(comment, []),
@@ -2681,12 +2681,12 @@
 
   void test_parseIdentifierList_multiple() {
     List<SimpleIdentifier> list = ParserTestCase.parse4("parseIdentifierList", "a, b, c", []);
-    EngineTestCase.assertSize(3, list);
+    EngineTestCase.assertSizeOfList(3, list);
   }
 
   void test_parseIdentifierList_single() {
     List<SimpleIdentifier> list = ParserTestCase.parse4("parseIdentifierList", "a", []);
-    EngineTestCase.assertSize(1, list);
+    EngineTestCase.assertSizeOfList(1, list);
   }
 
   void test_parseIfStatement_else_block() {
@@ -2735,13 +2735,13 @@
 
   void test_parseImplementsClause_multiple() {
     ImplementsClause clause = ParserTestCase.parse4("parseImplementsClause", "implements A, B, C", []);
-    EngineTestCase.assertSize(3, clause.interfaces);
+    EngineTestCase.assertSizeOfList(3, clause.interfaces);
     JUnitTestCase.assertNotNull(clause.keyword);
   }
 
   void test_parseImplementsClause_single() {
     ImplementsClause clause = ParserTestCase.parse4("parseImplementsClause", "implements A", []);
-    EngineTestCase.assertSize(1, clause.interfaces);
+    EngineTestCase.assertSizeOfList(1, clause.interfaces);
     JUnitTestCase.assertNotNull(clause.keyword);
   }
 
@@ -2751,7 +2751,7 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNull(directive.asToken);
     JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSize(1, directive.combinators);
+    EngineTestCase.assertSizeOfList(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -2761,7 +2761,7 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNull(directive.asToken);
     JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSize(0, directive.combinators);
+    EngineTestCase.assertSizeOfList(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -2771,7 +2771,7 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNotNull(directive.asToken);
     JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSize(0, directive.combinators);
+    EngineTestCase.assertSizeOfList(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -2781,7 +2781,7 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNotNull(directive.asToken);
     JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSize(2, directive.combinators);
+    EngineTestCase.assertSizeOfList(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -2791,7 +2791,7 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNotNull(directive.asToken);
     JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSize(2, directive.combinators);
+    EngineTestCase.assertSizeOfList(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
@@ -2801,13 +2801,13 @@
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNull(directive.asToken);
     JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSize(1, directive.combinators);
+    EngineTestCase.assertSizeOfList(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
 
   void test_parseInitializedIdentifierList_type() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    Token staticKeyword = TokenFactory.token(Keyword.STATIC);
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
     TypeName type = new TypeName(new SimpleIdentifier(null), null);
     FieldDeclaration declaration = ParserTestCase.parse("parseInitializedIdentifierList", <Object> [
         commentAndMetadata(comment, []),
@@ -2819,15 +2819,15 @@
     JUnitTestCase.assertNotNull(fields);
     JUnitTestCase.assertNull(fields.keyword);
     JUnitTestCase.assertEquals(type, fields.type);
-    EngineTestCase.assertSize(3, fields.variables);
+    EngineTestCase.assertSizeOfList(3, fields.variables);
     JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
     JUnitTestCase.assertNotNull(declaration.semicolon);
   }
 
   void test_parseInitializedIdentifierList_var() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    Token staticKeyword = TokenFactory.token(Keyword.STATIC);
-    Token varKeyword = TokenFactory.token(Keyword.VAR);
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
+    Token varKeyword = TokenFactory.tokenFromKeyword(Keyword.VAR);
     FieldDeclaration declaration = ParserTestCase.parse("parseInitializedIdentifierList", <Object> [
         commentAndMetadata(comment, []),
         staticKeyword,
@@ -2838,13 +2838,13 @@
     JUnitTestCase.assertNotNull(fields);
     JUnitTestCase.assertEquals(varKeyword, fields.keyword);
     JUnitTestCase.assertNull(fields.type);
-    EngineTestCase.assertSize(3, fields.variables);
+    EngineTestCase.assertSizeOfList(3, fields.variables);
     JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
     JUnitTestCase.assertNotNull(declaration.semicolon);
   }
 
   void test_parseInstanceCreationExpression_qualifiedType() {
-    Token token = TokenFactory.token(Keyword.NEW);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A.B()");
     JUnitTestCase.assertEquals(token, expression.keyword);
     ConstructorName name = expression.constructorName;
@@ -2856,7 +2856,7 @@
   }
 
   void test_parseInstanceCreationExpression_qualifiedType_named() {
-    Token token = TokenFactory.token(Keyword.NEW);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A.B.c()");
     JUnitTestCase.assertEquals(token, expression.keyword);
     ConstructorName name = expression.constructorName;
@@ -2868,7 +2868,7 @@
   }
 
   void test_parseInstanceCreationExpression_type() {
-    Token token = TokenFactory.token(Keyword.NEW);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A()");
     JUnitTestCase.assertEquals(token, expression.keyword);
     ConstructorName name = expression.constructorName;
@@ -2880,7 +2880,7 @@
   }
 
   void test_parseInstanceCreationExpression_type_named() {
-    Token token = TokenFactory.token(Keyword.NEW);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A<B>.c()");
     JUnitTestCase.assertEquals(token, expression.keyword);
     ConstructorName name = expression.constructorName;
@@ -2911,24 +2911,24 @@
   }
 
   void test_parseListLiteral_empty_oneToken() {
-    Token token = TokenFactory.token(Keyword.CONST);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
     TypeArgumentList typeArguments = null;
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [token, typeArguments], "[]");
     JUnitTestCase.assertEquals(token, literal.constKeyword);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.elements);
+    EngineTestCase.assertSizeOfList(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
   void test_parseListLiteral_empty_twoTokens() {
-    Token token = TokenFactory.token(Keyword.CONST);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
     TypeArgumentList typeArguments = null;
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [token, typeArguments], "[ ]");
     JUnitTestCase.assertEquals(token, literal.constKeyword);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.elements);
+    EngineTestCase.assertSizeOfList(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -2937,7 +2937,7 @@
     JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(3, literal.elements);
+    EngineTestCase.assertSizeOfList(3, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -2946,7 +2946,7 @@
     JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(1, literal.elements);
+    EngineTestCase.assertSizeOfList(1, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -2955,7 +2955,7 @@
     JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(1, literal.elements);
+    EngineTestCase.assertSizeOfList(1, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -2964,7 +2964,7 @@
     JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(1, literal.elements);
+    EngineTestCase.assertSizeOfList(1, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -2973,7 +2973,7 @@
     JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(1, literal.entries);
+    EngineTestCase.assertSizeOfList(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -2982,7 +2982,7 @@
     JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(1, literal.entries);
+    EngineTestCase.assertSizeOfList(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -3003,7 +3003,7 @@
   }
 
   void test_parseMapLiteral_empty() {
-    Token token = TokenFactory.token(Keyword.CONST);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
     TypeArgumentList typeArguments = AstFactory.typeArgumentList([
         AstFactory.typeName4("String", []),
         AstFactory.typeName4("int", [])]);
@@ -3011,21 +3011,21 @@
     JUnitTestCase.assertEquals(token, literal.constKeyword);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(0, literal.entries);
+    EngineTestCase.assertSizeOfList(0, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
   void test_parseMapLiteral_multiple() {
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [null, null], "{'a' : b, 'x' : y}");
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(2, literal.entries);
+    EngineTestCase.assertSizeOfList(2, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
   void test_parseMapLiteral_single() {
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [null, null], "{'x' : y}");
     JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSize(1, literal.entries);
+    EngineTestCase.assertSizeOfList(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
 
@@ -3180,7 +3180,7 @@
     JUnitTestCase.assertNotNull(expression.body);
     ArgumentList list = invocation.argumentList;
     JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSize(1, list.arguments);
+    EngineTestCase.assertSizeOfList(1, list.arguments);
   }
 
   void test_parseNonLabeledStatement_null() {
@@ -3242,7 +3242,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     FormalParameterList parameterList = parameter.parameters;
     JUnitTestCase.assertNotNull(parameterList);
-    EngineTestCase.assertSize(1, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
   }
 
   void test_parseNormalFormalParameter_field_function_noNested() {
@@ -3252,7 +3252,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     FormalParameterList parameterList = parameter.parameters;
     JUnitTestCase.assertNotNull(parameterList);
-    EngineTestCase.assertSize(0, parameterList.parameters);
+    EngineTestCase.assertSizeOfList(0, parameterList.parameters);
   }
 
   void test_parseNormalFormalParameter_field_noType() {
@@ -3485,7 +3485,7 @@
   void test_parsePrimaryExpression_listLiteral_typed() {
     ListLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "<A>[ ]", []);
     JUnitTestCase.assertNotNull(literal.typeArguments);
-    EngineTestCase.assertSize(1, literal.typeArguments.arguments);
+    EngineTestCase.assertSizeOfList(1, literal.typeArguments.arguments);
   }
 
   void test_parsePrimaryExpression_mapLiteral() {
@@ -3496,7 +3496,7 @@
   void test_parsePrimaryExpression_mapLiteral_typed() {
     MapLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "<A, B>{}", []);
     JUnitTestCase.assertNotNull(literal.typeArguments);
-    EngineTestCase.assertSize(2, literal.typeArguments.arguments);
+    EngineTestCase.assertSizeOfList(2, literal.typeArguments.arguments);
   }
 
   void test_parsePrimaryExpression_new() {
@@ -3661,7 +3661,7 @@
 
   void test_parseSetter_static() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    Token staticKeyword = TokenFactory.token(Keyword.STATIC);
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     MethodDeclaration method = ParserTestCase.parse("parseSetter", <Object> [
         commentAndMetadata(comment, []),
@@ -3720,7 +3720,7 @@
 
   void test_parseStatement_mulipleLabels() {
     LabeledStatement statement = ParserTestCase.parse4("parseStatement", "l: m: return x;", []);
-    EngineTestCase.assertSize(2, statement.labels);
+    EngineTestCase.assertSizeOfList(2, statement.labels);
     JUnitTestCase.assertNotNull(statement.statement);
   }
 
@@ -3730,24 +3730,24 @@
 
   void test_parseStatement_singleLabel() {
     LabeledStatement statement = ParserTestCase.parse4("parseStatement", "l: return x;", []);
-    EngineTestCase.assertSize(1, statement.labels);
+    EngineTestCase.assertSizeOfList(1, statement.labels);
     JUnitTestCase.assertNotNull(statement.statement);
   }
 
   void test_parseStatements_multiple() {
     List<Statement> statements = ParserTestCase.parseStatements("return; return;", 2, []);
-    EngineTestCase.assertSize(2, statements);
+    EngineTestCase.assertSizeOfList(2, statements);
   }
 
   void test_parseStatements_single() {
     List<Statement> statements = ParserTestCase.parseStatements("return;", 1, []);
-    EngineTestCase.assertSize(1, statements);
+    EngineTestCase.assertSizeOfList(1, statements);
   }
 
   void test_parseStringLiteral_adjacent() {
     AdjacentStrings literal = ParserTestCase.parse4("parseStringLiteral", "'a' 'b'", []);
     NodeList<StringLiteral> strings = literal.strings;
-    EngineTestCase.assertSize(2, strings);
+    EngineTestCase.assertSizeOfList(2, strings);
     StringLiteral firstString = strings[0];
     StringLiteral secondString = strings[1];
     JUnitTestCase.assertEquals("a", (firstString as SimpleStringLiteral).value);
@@ -3757,7 +3757,7 @@
   void test_parseStringLiteral_interpolated() {
     StringInterpolation literal = ParserTestCase.parse4("parseStringLiteral", "'a \${b} c \$this d'", []);
     NodeList<InterpolationElement> elements = literal.elements;
-    EngineTestCase.assertSize(5, elements);
+    EngineTestCase.assertSizeOfList(5, elements);
     JUnitTestCase.assertTrue(elements[0] is InterpolationString);
     JUnitTestCase.assertTrue(elements[1] is InterpolationExpression);
     JUnitTestCase.assertTrue(elements[2] is InterpolationString);
@@ -3794,7 +3794,7 @@
     JUnitTestCase.assertNotNull(statement.expression);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSize(1, statement.members);
+    EngineTestCase.assertSizeOfList(1, statement.members);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
 
@@ -3805,7 +3805,7 @@
     JUnitTestCase.assertNotNull(statement.expression);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSize(0, statement.members);
+    EngineTestCase.assertSizeOfList(0, statement.members);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
 
@@ -3816,8 +3816,8 @@
     JUnitTestCase.assertNotNull(statement.expression);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSize(1, statement.members);
-    EngineTestCase.assertSize(3, statement.members[0].labels);
+    EngineTestCase.assertSizeOfList(1, statement.members);
+    EngineTestCase.assertSizeOfList(3, statement.members[0].labels);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
 
@@ -3828,8 +3828,8 @@
     JUnitTestCase.assertNotNull(statement.expression);
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSize(1, statement.members);
-    EngineTestCase.assertSize(3, statement.members[0].statements);
+    EngineTestCase.assertSizeOfList(1, statement.members);
+    EngineTestCase.assertSizeOfList(3, statement.members[0].statements);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
 
@@ -3886,7 +3886,7 @@
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSize(1, catchClauses);
+    EngineTestCase.assertSizeOfList(1, catchClauses);
     CatchClause clause = catchClauses[0];
     JUnitTestCase.assertNull(clause.onKeyword);
     JUnitTestCase.assertNull(clause.exceptionType);
@@ -3904,7 +3904,7 @@
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSize(1, catchClauses);
+    EngineTestCase.assertSizeOfList(1, catchClauses);
     CatchClause clause = catchClauses[0];
     JUnitTestCase.assertNull(clause.onKeyword);
     JUnitTestCase.assertNull(clause.exceptionType);
@@ -3921,7 +3921,7 @@
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} finally {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
-    EngineTestCase.assertSize(0, statement.catchClauses);
+    EngineTestCase.assertSizeOfList(0, statement.catchClauses);
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
     JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
@@ -3930,7 +3930,7 @@
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} on NPE catch (e) {} on Error {} catch (e) {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
-    EngineTestCase.assertSize(3, statement.catchClauses);
+    EngineTestCase.assertSizeOfList(3, statement.catchClauses);
     JUnitTestCase.assertNull(statement.finallyKeyword);
     JUnitTestCase.assertNull(statement.finallyBlock);
   }
@@ -3940,7 +3940,7 @@
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSize(1, catchClauses);
+    EngineTestCase.assertSizeOfList(1, catchClauses);
     CatchClause clause = catchClauses[0];
     JUnitTestCase.assertNotNull(clause.onKeyword);
     JUnitTestCase.assertNotNull(clause.exceptionType);
@@ -3958,7 +3958,7 @@
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSize(1, catchClauses);
+    EngineTestCase.assertSizeOfList(1, catchClauses);
     CatchClause clause = catchClauses[0];
     JUnitTestCase.assertNotNull(clause.onKeyword);
     JUnitTestCase.assertNotNull(clause.exceptionType);
@@ -3976,7 +3976,7 @@
     JUnitTestCase.assertNotNull(statement.tryKeyword);
     JUnitTestCase.assertNotNull(statement.body);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSize(1, catchClauses);
+    EngineTestCase.assertSizeOfList(1, catchClauses);
     CatchClause clause = catchClauses[0];
     JUnitTestCase.assertNotNull(clause.onKeyword);
     JUnitTestCase.assertNotNull(clause.exceptionType);
@@ -4052,26 +4052,26 @@
   void test_parseTypeArgumentList_multiple() {
     TypeArgumentList argumentList = ParserTestCase.parse4("parseTypeArgumentList", "<int, int, int>", []);
     JUnitTestCase.assertNotNull(argumentList.leftBracket);
-    EngineTestCase.assertSize(3, argumentList.arguments);
+    EngineTestCase.assertSizeOfList(3, argumentList.arguments);
     JUnitTestCase.assertNotNull(argumentList.rightBracket);
   }
 
   void test_parseTypeArgumentList_nested() {
     TypeArgumentList argumentList = ParserTestCase.parse4("parseTypeArgumentList", "<A<B>>", []);
     JUnitTestCase.assertNotNull(argumentList.leftBracket);
-    EngineTestCase.assertSize(1, argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
     TypeName argument = argumentList.arguments[0];
     JUnitTestCase.assertNotNull(argument);
     TypeArgumentList innerList = argument.typeArguments;
     JUnitTestCase.assertNotNull(innerList);
-    EngineTestCase.assertSize(1, innerList.arguments);
+    EngineTestCase.assertSizeOfList(1, innerList.arguments);
     JUnitTestCase.assertNotNull(argumentList.rightBracket);
   }
 
   void test_parseTypeArgumentList_single() {
     TypeArgumentList argumentList = ParserTestCase.parse4("parseTypeArgumentList", "<int>", []);
     JUnitTestCase.assertNotNull(argumentList.leftBracket);
-    EngineTestCase.assertSize(1, argumentList.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
     JUnitTestCase.assertNotNull(argumentList.rightBracket);
   }
 
@@ -4105,28 +4105,28 @@
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A, B extends C, D>", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSize(3, parameterList.typeParameters);
+    EngineTestCase.assertSizeOfList(3, parameterList.typeParameters);
   }
 
   void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A extends B<E>>=", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSize(1, parameterList.typeParameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.typeParameters);
   }
 
   void test_parseTypeParameterList_single() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A>", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSize(1, parameterList.typeParameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.typeParameters);
   }
 
   void test_parseTypeParameterList_withTrailingEquals() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A>=", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSize(1, parameterList.typeParameters);
+    EngineTestCase.assertSizeOfList(1, parameterList.typeParameters);
   }
 
   void test_parseUnaryExpression_decrement_normal() {
@@ -4246,56 +4246,56 @@
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "const a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_const_type() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "const A a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_final_noType() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "final a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_final_type() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "final A a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_type_multiple() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "A a, b, c");
     JUnitTestCase.assertNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSize(3, declarationList.variables);
+    EngineTestCase.assertSizeOfList(3, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_type_single() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "A a");
     JUnitTestCase.assertNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_var_multiple() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "var a, b, c");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSize(3, declarationList.variables);
+    EngineTestCase.assertSizeOfList(3, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_var_single() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "var a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterType_type() {
@@ -4303,15 +4303,15 @@
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterType", <Object> [emptyCommentAndMetadata(), null, type], "a");
     JUnitTestCase.assertNull(declarationList.keyword);
     JUnitTestCase.assertEquals(type, declarationList.type);
-    EngineTestCase.assertSize(1, declarationList.variables);
+    EngineTestCase.assertSizeOfList(1, declarationList.variables);
   }
 
   void test_parseVariableDeclarationListAfterType_var() {
-    Token keyword = TokenFactory.token(Keyword.VAR);
+    Token keyword = TokenFactory.tokenFromKeyword(Keyword.VAR);
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterType", <Object> [emptyCommentAndMetadata(), keyword, null], "a, b, c");
     JUnitTestCase.assertEquals(keyword, declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSize(3, declarationList.variables);
+    EngineTestCase.assertSizeOfList(3, declarationList.variables);
   }
 
   void test_parseVariableDeclarationStatementAfterMetadata_multiple() {
@@ -4319,7 +4319,7 @@
     JUnitTestCase.assertNotNull(statement.semicolon);
     VariableDeclarationList variableList = statement.variables;
     JUnitTestCase.assertNotNull(variableList);
-    EngineTestCase.assertSize(3, variableList.variables);
+    EngineTestCase.assertSizeOfList(3, variableList.variables);
   }
 
   void test_parseVariableDeclarationStatementAfterMetadata_single() {
@@ -4327,7 +4327,7 @@
     JUnitTestCase.assertNotNull(statement.semicolon);
     VariableDeclarationList variableList = statement.variables;
     JUnitTestCase.assertNotNull(variableList);
-    EngineTestCase.assertSize(1, variableList.variables);
+    EngineTestCase.assertSizeOfList(1, variableList.variables);
   }
 
   void test_parseWhileStatement() {
@@ -4342,13 +4342,13 @@
   void test_parseWithClause_multiple() {
     WithClause clause = ParserTestCase.parse4("parseWithClause", "with A, B, C", []);
     JUnitTestCase.assertNotNull(clause.withKeyword);
-    EngineTestCase.assertSize(3, clause.mixinTypes);
+    EngineTestCase.assertSizeOfList(3, clause.mixinTypes);
   }
 
   void test_parseWithClause_single() {
     WithClause clause = ParserTestCase.parse4("parseWithClause", "with M", []);
     JUnitTestCase.assertNotNull(clause.withKeyword);
-    EngineTestCase.assertSize(1, clause.mixinTypes);
+    EngineTestCase.assertSizeOfList(1, clause.mixinTypes);
   }
 
   void test_skipPrefixedIdentifier_invalid() {
@@ -6845,14 +6845,14 @@
     JUnitTestCase.assertEquals("d", invocation2.methodName.name);
     ArgumentList argumentList2 = invocation2.argumentList;
     JUnitTestCase.assertNotNull(argumentList2);
-    EngineTestCase.assertSize(1, argumentList2.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList2.arguments);
     //
     // a(b)(c)
     //
     FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpressionInvocation, FunctionExpressionInvocation, invocation2.target);
     ArgumentList argumentList3 = invocation3.argumentList;
     JUnitTestCase.assertNotNull(argumentList3);
-    EngineTestCase.assertSize(1, argumentList3.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList3.arguments);
     //
     // a(b)
     //
@@ -6860,7 +6860,7 @@
     JUnitTestCase.assertEquals("a", invocation4.methodName.name);
     ArgumentList argumentList4 = invocation4.argumentList;
     JUnitTestCase.assertNotNull(argumentList4);
-    EngineTestCase.assertSize(1, argumentList4.arguments);
+    EngineTestCase.assertSizeOfList(1, argumentList4.arguments);
   }
 
   void test_assignmentExpression_compound() {
@@ -6973,7 +6973,7 @@
         "  }",
         "}"]), []);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSize(1, declarations);
+    EngineTestCase.assertSizeOfList(1, declarations);
   }
 
   void test_equalityExpression_normal() {
@@ -7028,7 +7028,7 @@
 
   void test_multipleLabels_statement() {
     LabeledStatement statement = ParserTestCase.parseStatement("a: b: c: return x;", []);
-    EngineTestCase.assertSize(3, statement.labels);
+    EngineTestCase.assertSizeOfList(3, statement.labels);
     EngineTestCase.assertInstanceOf((obj) => obj is ReturnStatement, ReturnStatement, statement.statement);
   }
 
@@ -7344,7 +7344,7 @@
   static Object parse3(String methodName, List<Object> objects, String source, List<ErrorCode> errorCodes) {
     GatheringErrorListener listener = new GatheringErrorListener();
     Object result = invokeParserMethod(methodName, objects, source, listener);
-    listener.assertErrors2(errorCodes);
+    listener.assertErrorsWithCodes(errorCodes);
     return result;
   }
 
@@ -7381,7 +7381,7 @@
     Parser parser = new Parser(null, listener);
     CompilationUnit unit = parser.parseCompilationUnit(token);
     JUnitTestCase.assertNotNull(unit);
-    listener.assertErrors2(errorCodes);
+    listener.assertErrorsWithCodes(errorCodes);
     return unit;
   }
 
@@ -7402,7 +7402,7 @@
     Parser parser = new Parser(null, listener);
     Expression expression = parser.parseExpression(token);
     JUnitTestCase.assertNotNull(expression);
-    listener.assertErrors2(errorCodes);
+    listener.assertErrorsWithCodes(errorCodes);
     return expression;
   }
 
@@ -7423,7 +7423,7 @@
     Parser parser = new Parser(null, listener);
     Statement statement = parser.parseStatement(token);
     JUnitTestCase.assertNotNull(statement);
-    listener.assertErrors2(errorCodes);
+    listener.assertErrorsWithCodes(errorCodes);
     return statement;
   }
 
@@ -7445,8 +7445,8 @@
     Token token = scanner.tokenize();
     Parser parser = new Parser(null, listener);
     List<Statement> statements = parser.parseStatements(token);
-    EngineTestCase.assertSize(expectedCount, statements);
-    listener.assertErrors2(errorCodes);
+    EngineTestCase.assertSizeOfList(expectedCount, statements);
+    listener.assertErrorsWithCodes(errorCodes);
     return statements;
   }
 
@@ -7482,7 +7482,7 @@
     //
     // Partially test the results.
     //
-    if (!listener.hasErrors()) {
+    if (!listener.hasErrors) {
       JUnitTestCase.assertNotNull(result);
     }
     return result;
@@ -8670,7 +8670,7 @@
 
   void test_expressionList_multiple_end() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", ", 2, 3, 4", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSize(4, result);
+    EngineTestCase.assertSizeOfList(4, result);
     Expression syntheticExpression = result[0];
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
@@ -8678,7 +8678,7 @@
 
   void test_expressionList_multiple_middle() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSize(4, result);
+    EngineTestCase.assertSizeOfList(4, result);
     Expression syntheticExpression = result[2];
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
@@ -8686,7 +8686,7 @@
 
   void test_expressionList_multiple_start() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSize(4, result);
+    EngineTestCase.assertSizeOfList(4, result);
     Expression syntheticExpression = result[3];
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
@@ -8695,11 +8695,11 @@
   void test_incomplete_topLevelVariable() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSize(1, declarations);
+    EngineTestCase.assertSizeOfList(1, declarations);
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
     NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSize(1, variables);
+    EngineTestCase.assertSizeOfList(1, variables);
     SimpleIdentifier name = variables[0].name;
     JUnitTestCase.assertTrue(name.isSynthetic);
   }
@@ -8803,7 +8803,7 @@
     MethodDeclaration method = ParserTestCase.parse3("parseClassMember", <Object> ["C"], "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
     JUnitTestCase.assertNull(method.documentationComment);
     NodeList<Annotation> metadata = method.metadata;
-    EngineTestCase.assertSize(1, metadata);
+    EngineTestCase.assertSizeOfList(1, metadata);
     JUnitTestCase.assertEquals("override", metadata[0].name.name);
   }
 
@@ -8946,7 +8946,7 @@
         ParserErrorCode.EXPECTED_TOKEN,
         ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSize(1, declarations);
+    EngineTestCase.assertSizeOfList(1, declarations);
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
   }
@@ -9523,7 +9523,7 @@
     // Validate that the results of the incremental parse are the same as the full parse of the
     // modified source.
     //
-    JUnitTestCase.assertTrue(AstComparator.equals4(modifiedUnit, incrementalUnit));
+    JUnitTestCase.assertTrue(AstComparator.equalUnits(modifiedUnit, incrementalUnit));
   }
 
   static dartSuite() {
@@ -10008,7 +10008,7 @@
   }
 
   void test_expectedToken_semicolonAfterClass() {
-    Token token = TokenFactory.token(Keyword.CLASS);
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ParserTestCase.parse3("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B", [ParserErrorCode.EXPECTED_TOKEN]);
   }
 
@@ -10537,7 +10537,7 @@
     MethodInvocation methodInvocation = ParserTestCase.parse4("parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]);
     JUnitTestCase.assertNull(methodInvocation.target);
     JUnitTestCase.assertEquals("", methodInvocation.methodName.name);
-    EngineTestCase.assertSize(0, methodInvocation.argumentList.arguments);
+    EngineTestCase.assertSizeOfList(0, methodInvocation.argumentList.arguments);
   }
 
   void test_positionalAfterNamedArgument() {
@@ -11780,7 +11780,6 @@
   'findRange_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.findRange(arg0, arg1)),
   'getCodeBlockRanges_1': new MethodTrampoline(1, (Parser target, arg0) => target.getCodeBlockRanges(arg0)),
   'getEndToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.getEndToken(arg0)),
-  'hasReturnTypeInTypeAlias_0': new MethodTrampoline(0, (Parser target) => target.hasReturnTypeInTypeAlias()),
   'injectToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.injectToken(arg0)),
   'isFunctionDeclaration_0': new MethodTrampoline(0, (Parser target) => target.isFunctionDeclaration()),
   'isFunctionExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.isFunctionExpression(arg0)),
@@ -11881,7 +11880,7 @@
   'parseVariableDeclarationStatementAfterType_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseVariableDeclarationStatementAfterType(arg0, arg1, arg2)),
   'parseWhileStatement_0': new MethodTrampoline(0, (Parser target) => target.parseWhileStatement()),
   'peek_0': new MethodTrampoline(0, (Parser target) => target.peek()),
-  'peek_1': new MethodTrampoline(1, (Parser target, arg0) => target.peek2(arg0)),
+  'peekAt_1': new MethodTrampoline(1, (Parser target, arg0) => target.peekAt(arg0)),
   'reportError_1': new MethodTrampoline(1, (Parser target, arg0) => target.reportError(arg0)),
   'reportErrorForCurrentToken_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportErrorForCurrentToken(arg0, arg1)),
   'reportErrorForNode_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportErrorForNode(arg0, arg1, arg2)),
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 3476dfa..702dae0 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -957,8 +957,8 @@
         "library L;",
         "export 'lib1.dart';",
         "export 'lib2.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class M {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class M {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -969,8 +969,8 @@
         "library L;",
         "export 'lib1.dart';",
         "export 'lib2.dart' hide B;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -981,8 +981,8 @@
         "library L;",
         "export 'lib1.dart';",
         "export 'lib2.dart' show C;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -990,7 +990,7 @@
 
   void test_ambiguousExport_sameDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib.dart';", "export 'lib.dart';"]));
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class N {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class N {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1119,7 +1119,7 @@
         "main() {",
         "  foo.x = true;",
         "}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "bool x = false;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "bool x = false;"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1431,7 +1431,7 @@
   }
 
   void test_constEval_propertyExtraction_fieldStatic_targetType() {
-    addSource2("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
+    addNamedSource("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'math.dart' as math;", "const C = math.PI;"]));
     resolve(source);
     assertNoErrors(source);
@@ -1451,7 +1451,7 @@
   }
 
   void test_constEval_symbol() {
-    addSource2("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
+    addNamedSource("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
     Source source = addSource(EngineTestCase.createSource(["const C = #foo;", "foo() {}"]));
     resolve(source);
     assertNoErrors(source);
@@ -1616,7 +1616,7 @@
         "library lib;",
         "import 'lib1.dart' hide B;",
         "A a = new A();"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource([
+    addNamedSource("/lib1.dart", EngineTestCase.createSource([
         "library lib1;",
         "class A {}",
         "@deprecated",
@@ -1669,7 +1669,7 @@
 
   void test_exportOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1677,7 +1677,7 @@
 
   void test_exportOfNonLibrary_libraryNotDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource([""]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource([""]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2057,7 +2057,7 @@
         "library test;",
         "import 'lib.dart';",
         "import 'lib.dart';"]));
-    addSource2("/lib.dart", "library lib;");
+    addNamedSource("/lib.dart", "library lib;");
     resolve(source);
     assertErrors(source, [
         HintCode.UNUSED_IMPORT,
@@ -2068,7 +2068,7 @@
 
   void test_importOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addSource2("/part.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2076,7 +2076,7 @@
 
   void test_importOfNonLibrary_libraryNotDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addSource2("/part.dart", EngineTestCase.createSource(["class A {}"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["class A {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2091,8 +2091,8 @@
         "  math.test1();",
         "  path.test2();",
         "}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "test1() {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "test2() {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "test1() {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "test2() {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2256,7 +2256,7 @@
         "class B extends A {",
         "  _m() {}",
         "}"]));
-    addSource2("/lib.dart", EngineTestCase.createSource(["library L;", "class A {", "  static var _m;", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library L;", "class A {", "  static var _m;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2268,7 +2268,7 @@
         "class B extends A {",
         "  _m() {}",
         "}"]));
-    addSource2("/lib.dart", EngineTestCase.createSource(["library L;", "class A {", "  static _m() {}", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library L;", "class A {", "  static _m() {}", "}"]));
     resolve(source);
     assertErrors(source, []);
     verify([source]);
@@ -2282,7 +2282,7 @@
   }
 
   void test_invalidAnnotation_constantVariable_field_importWithPrefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  static const C = 0;", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  static const C = 0;", "}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.A.C", "main() {", "}"]));
     resolve(source);
     assertNoErrors(source);
@@ -2297,7 +2297,7 @@
   }
 
   void test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "const C = 0;"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "const C = 0;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.C", "main() {", "}"]));
     resolve(source);
     assertNoErrors(source);
@@ -2305,7 +2305,7 @@
   }
 
   void test_invalidAnnotation_constConstructor_importWithPrefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  const A(int p);", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  const A(int p);", "}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.A(42)", "main() {", "}"]));
     resolve(source);
     assertNoErrors(source);
@@ -2313,7 +2313,7 @@
   }
 
   void test_invalidAnnotation_constConstructor_named_importWithPrefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource([
+    addNamedSource("/lib.dart", EngineTestCase.createSource([
         "library lib;",
         "class A {",
         "  const A.named(int p);",
@@ -2500,7 +2500,7 @@
   }
 
   void test_invalidOverrideReturnType_returnType_interface() {
-    Source source = addSource2("/test.dart", EngineTestCase.createSource([
+    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
         "abstract class A {",
         "  num m();",
         "}",
@@ -2513,7 +2513,7 @@
   }
 
   void test_invalidOverrideReturnType_returnType_interface2() {
-    Source source = addSource2("/test.dart", EngineTestCase.createSource([
+    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
         "abstract class A {",
         "  num m();",
         "}",
@@ -2528,7 +2528,7 @@
   }
 
   void test_invalidOverrideReturnType_returnType_mixin() {
-    Source source = addSource2("/test.dart", EngineTestCase.createSource([
+    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
         "class A {",
         "  num m() { return 0; }",
         "}",
@@ -2554,7 +2554,7 @@
   }
 
   void test_invalidOverrideReturnType_returnType_sameType() {
-    Source source = addSource2("/test.dart", EngineTestCase.createSource([
+    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
         "class A {",
         "  int m() { return 0; }",
         "}",
@@ -2567,7 +2567,7 @@
   }
 
   void test_invalidOverrideReturnType_returnType_superclass() {
-    Source source = addSource2("/test.dart", EngineTestCase.createSource([
+    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
         "class A {",
         "  num m() { return 0; }",
         "}",
@@ -2580,7 +2580,7 @@
   }
 
   void test_invalidOverrideReturnType_returnType_superclass2() {
-    Source source = addSource2("/test.dart", EngineTestCase.createSource([
+    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
         "class A {",
         "  num m() { return 0; }",
         "}",
@@ -3463,7 +3463,7 @@
   }
 
   void test_prefixCollidesWithTopLevelMembers() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {}"]));
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart' as p;",
         "typedef P();",
@@ -4267,7 +4267,7 @@
   }
 
   void test_typeType_class_prefixed() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart' as p;",
         "f(Type t) {}",
@@ -4292,7 +4292,7 @@
   }
 
   void test_typeType_functionTypeAlias_prefixed() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef F();"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef F();"]));
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart' as p;",
         "f(Type t) {}",
@@ -4399,7 +4399,7 @@
 
   void test_undefinedIdentifier_hide() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' hide a;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4407,7 +4407,7 @@
 
   void test_undefinedIdentifier_show() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' show a;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4460,7 +4460,7 @@
   }
 
   void test_undefinedSetter_importWithPrefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "set y(int value) {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "set y(int value) {}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as x;", "main() {", "  x.y = 0;", "}"]));
     resolve(source);
     assertNoErrors(source);
@@ -4512,21 +4512,21 @@
   }
 
   void test_uriDoesNotExist_dll() {
-    addSource2("/lib.dll", "");
+    addNamedSource("/lib.dll", "");
     Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:lib';"]));
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_uriDoesNotExist_dylib() {
-    addSource2("/lib.dylib", "");
+    addNamedSource("/lib.dylib", "");
     Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:lib';"]));
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_uriDoesNotExist_so() {
-    addSource2("/lib.so", "");
+    addNamedSource("/lib.so", "");
     Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:lib';"]));
     resolve(source);
     assertNoErrors(source);
@@ -5866,69 +5866,69 @@
   /**
    * The library used by the tests.
    */
-  Library _library5;
+  Library _library;
 
   void setUp() {
     _sourceFactory = new SourceFactory([new FileUriResolver()]);
     _analysisContext = new AnalysisContextImpl();
     _analysisContext.sourceFactory = _sourceFactory;
     _errorListener = new GatheringErrorListener();
-    _library5 = library("/lib.dart");
+    _library = createLibrary("/lib.dart");
   }
 
   void test_getExplicitlyImportsCore() {
-    JUnitTestCase.assertFalse(_library5.explicitlyImportsCore);
+    JUnitTestCase.assertFalse(_library.explicitlyImportsCore);
     _errorListener.assertNoErrors();
   }
 
   void test_getExports() {
-    EngineTestCase.assertLength(0, _library5.exports);
+    EngineTestCase.assertLength(0, _library.exports);
     _errorListener.assertNoErrors();
   }
 
   void test_getImports() {
-    EngineTestCase.assertLength(0, _library5.imports);
+    EngineTestCase.assertLength(0, _library.imports);
     _errorListener.assertNoErrors();
   }
 
   void test_getImportsAndExports() {
-    _library5.importedLibraries = <Library> [library("/imported.dart")];
-    _library5.exportedLibraries = <Library> [library("/exported.dart")];
-    EngineTestCase.assertLength(2, _library5.importsAndExports);
+    _library.importedLibraries = <Library> [createLibrary("/imported.dart")];
+    _library.exportedLibraries = <Library> [createLibrary("/exported.dart")];
+    EngineTestCase.assertLength(2, _library.importsAndExports);
     _errorListener.assertNoErrors();
   }
 
   void test_getLibraryScope() {
     LibraryElementImpl element = new LibraryElementImpl(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
     element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
-    _library5.libraryElement = element;
-    JUnitTestCase.assertNotNull(_library5.libraryScope);
+    _library.libraryElement = element;
+    JUnitTestCase.assertNotNull(_library.libraryScope);
     _errorListener.assertNoErrors();
   }
 
   void test_getLibrarySource() {
-    JUnitTestCase.assertNotNull(_library5.librarySource);
+    JUnitTestCase.assertNotNull(_library.librarySource);
   }
 
   void test_setExplicitlyImportsCore() {
-    _library5.explicitlyImportsCore = true;
-    JUnitTestCase.assertTrue(_library5.explicitlyImportsCore);
+    _library.explicitlyImportsCore = true;
+    JUnitTestCase.assertTrue(_library.explicitlyImportsCore);
     _errorListener.assertNoErrors();
   }
 
   void test_setExportedLibraries() {
-    Library exportLibrary = library("/exported.dart");
-    _library5.exportedLibraries = <Library> [exportLibrary];
-    List<Library> exports = _library5.exports;
+    Library exportLibrary = createLibrary("/exported.dart");
+    _library.exportedLibraries = <Library> [exportLibrary];
+    List<Library> exports = _library.exports;
     EngineTestCase.assertLength(1, exports);
     JUnitTestCase.assertSame(exportLibrary, exports[0]);
     _errorListener.assertNoErrors();
   }
 
   void test_setImportedLibraries() {
-    Library importLibrary = library("/imported.dart");
-    _library5.importedLibraries = <Library> [importLibrary];
-    List<Library> imports = _library5.imports;
+    Library importLibrary = createLibrary("/imported.dart");
+    _library.importedLibraries = <Library> [importLibrary];
+    List<Library> imports = _library.imports;
     EngineTestCase.assertLength(1, imports);
     JUnitTestCase.assertSame(importLibrary, imports[0]);
     _errorListener.assertNoErrors();
@@ -5936,11 +5936,11 @@
 
   void test_setLibraryElement() {
     LibraryElementImpl element = new LibraryElementImpl(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
-    _library5.libraryElement = element;
-    JUnitTestCase.assertSame(element, _library5.libraryElement);
+    _library.libraryElement = element;
+    JUnitTestCase.assertSame(element, _library.libraryElement);
   }
 
-  Library library(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
+  Library createLibrary(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
 
   static dartSuite() {
     _ut.group('LibraryTest', () {
@@ -6096,16 +6096,16 @@
     Source source = addSource(oldContent);
     LibraryElement library = resolve(source);
     CompilationUnit oldUnit = resolveCompilationUnit(source, library);
-    MethodElement element = getMethod2(oldUnit).element as MethodElement;
+    MethodElement element = getFirstMethod(oldUnit).element as MethodElement;
     AnalysisContext context = analysisContext;
     context.setContents(source, newContent);
     CompilationUnit newUnit = context.parseCompilationUnit(source);
-    MethodDeclaration newMethod = getMethod2(newUnit);
+    MethodDeclaration newMethod = getFirstMethod(newUnit);
     DeclarationMatcher matcher = new DeclarationMatcher();
     JUnitTestCase.assertEquals(expectMatch, matcher.matches(newMethod, element));
   }
 
-  MethodDeclaration getMethod2(CompilationUnit unit) {
+  MethodDeclaration getFirstMethod(CompilationUnit unit) {
     ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
     return classNode.members[0] as MethodDeclaration;
   }
@@ -7059,7 +7059,7 @@
   }
 
   void test_undefinedMethod_private() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  _foo() {}", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  _foo() {}", "}"]));
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart';",
         "class B extends A {",
@@ -7676,7 +7676,7 @@
         "class B extends A {",
         "  get _g => 0;",
         "}"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  get _g => 0;", "}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  get _g => 0;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
@@ -7688,7 +7688,7 @@
         "class B extends A {",
         "  _m(int x) => 0;",
         "}"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  _m(int x) => 0;", "}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  _m(int x) => 0;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
@@ -7701,7 +7701,7 @@
         "class C extends B {",
         "  _m(int x) => 0;",
         "}"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  _m(int x) => 0;", "}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  _m(int x) => 0;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
@@ -7713,7 +7713,7 @@
         "class B extends A {",
         "  set _s(int x) {}",
         "}"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  set _s(int x) {}", "}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  set _s(int x) {}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
@@ -8005,7 +8005,7 @@
 
   void test_deprecatedAnnotationUse_export() {
     Source source = addSource(EngineTestCase.createSource(["export 'deprecated_library.dart';"]));
-    addSource2("/deprecated_library.dart", EngineTestCase.createSource([
+    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
         "@deprecated",
         "library deprecated_library;",
         "class A {}"]));
@@ -8030,7 +8030,7 @@
 
   void test_deprecatedAnnotationUse_import() {
     Source source = addSource(EngineTestCase.createSource(["import 'deprecated_library.dart';", "f(A a) {}"]));
-    addSource2("/deprecated_library.dart", EngineTestCase.createSource([
+    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
         "@deprecated",
         "library deprecated_library;",
         "class A {}"]));
@@ -8184,7 +8184,7 @@
         "import 'lib1.dart';",
         "import 'lib1.dart';",
         "A a;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
     verify([source]);
@@ -8197,7 +8197,7 @@
         "import 'lib1.dart';",
         "import 'lib1.dart';",
         "A a;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
     verify([source]);
@@ -8209,7 +8209,7 @@
         "import 'lib1.dart' as M show A hide B;",
         "import 'lib1.dart' as M show A hide B;",
         "M.A a;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
     resolve(source);
     assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.UNUSED_IMPORT]);
     verify([source]);
@@ -8488,7 +8488,7 @@
 
   void test_unusedImport() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -8501,7 +8501,7 @@
         "import 'lib1.dart';",
         "import 'lib1.dart' as one;",
         "one.A a;"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -8514,7 +8514,7 @@
         "import 'lib1.dart';",
         "import 'lib1.dart' hide A;",
         "A a;"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -8527,7 +8527,7 @@
         "import 'lib1.dart' show A;",
         "import 'lib1.dart' show B;",
         "A a;"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -9032,7 +9032,7 @@
     CatchClause clause = AstFactory.catchClause("e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    resolve(clause, _typeProvider.dynamicType, null, []);
+    resolveCatchClause(clause, _typeProvider.dynamicType, null, []);
     _listener.assertNoErrors();
   }
 
@@ -9043,7 +9043,7 @@
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
     stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
-    resolve(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
+    resolveCatchClause(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
     _listener.assertNoErrors();
   }
 
@@ -9054,7 +9054,7 @@
     CatchClause clause = AstFactory.catchClause4(exceptionType, "e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    resolve(clause, exceptionElement.type, null, [exceptionElement]);
+    resolveCatchClause(clause, exceptionElement.type, null, [exceptionElement]);
     _listener.assertNoErrors();
   }
 
@@ -9068,7 +9068,7 @@
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
     stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
-    resolve(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
+    resolveCatchClause(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
     _listener.assertNoErrors();
   }
 
@@ -9124,7 +9124,7 @@
     String outerParameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter2(null, intTypeName, outerParameterName, AstFactory.formalParameterList([parameter]));
     node.identifier.staticElement = ElementFactory.requiredParameter(outerParameterName);
-    Type2 parameterType = resolve6(node, [intType.element]);
+    Type2 parameterType = resolveFormalParameter(node, [intType.element]);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, parameterType);
     FunctionType functionType = parameterType as FunctionType;
     JUnitTestCase.assertSame(intType, functionType.returnType);
@@ -9136,7 +9136,7 @@
     String parameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
     node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, resolve6(node, []));
+    JUnitTestCase.assertSame(_typeProvider.dynamicType, resolveFormalParameter(node, []));
     _listener.assertNoErrors();
   }
 
@@ -9146,7 +9146,7 @@
     String parameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, parameterName);
     node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(intType, resolve6(node, [intType.element]));
+    JUnitTestCase.assertSame(intType, resolveFormalParameter(node, [intType.element]));
     _listener.assertNoErrors();
   }
 
@@ -9154,7 +9154,7 @@
     // p
     FormalParameter node = AstFactory.simpleFormalParameter3("p");
     node.identifier.staticElement = new ParameterElementImpl.con1(AstFactory.identifier3("p"));
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, resolve6(node, []));
+    JUnitTestCase.assertSame(_typeProvider.dynamicType, resolveFormalParameter(node, []));
     _listener.assertNoErrors();
   }
 
@@ -9166,7 +9166,7 @@
     SimpleIdentifier identifier = node.identifier;
     ParameterElementImpl element = new ParameterElementImpl.con1(identifier);
     identifier.staticElement = element;
-    JUnitTestCase.assertSame(intType, resolve6(node, [intElement]));
+    JUnitTestCase.assertSame(intType, resolveFormalParameter(node, [intElement]));
     _listener.assertNoErrors();
   }
 
@@ -9225,7 +9225,7 @@
    * @param definedElements the elements that are to be defined in the scope in which the element is
    *          being resolved
    */
-  void resolve(CatchClause node, Type2 exceptionType, InterfaceType stackTraceType, List<Element> definedElements) {
+  void resolveCatchClause(CatchClause node, Type2 exceptionType, InterfaceType stackTraceType, List<Element> definedElements) {
     resolveNode(node, definedElements);
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
@@ -9246,7 +9246,7 @@
    *          being resolved
    * @return the type associated with the parameter
    */
-  Type2 resolve6(FormalParameter node, List<Element> definedElements) {
+  Type2 resolveFormalParameter(FormalParameter node, List<Element> definedElements) {
     resolveNode(node, definedElements);
     return (node.identifier.staticElement as ParameterElement).type;
   }
@@ -9344,29 +9344,29 @@
   }
 
   /**
-   * Add a source file to the content provider.
-   *
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the added file
-   */
-  Source addSource(String contents) => addSource2("/test.dart", contents);
-
-  /**
    * Add a source file to the content provider. The file path should be absolute.
    *
    * @param filePath the path of the file being added
    * @param contents the contents to be returned by the content provider for the specified file
    * @return the source object representing the added file
    */
-  Source addSource2(String filePath, String contents) {
+  Source addNamedSource(String filePath, String contents) {
     Source source = cacheSource(filePath, contents);
     ChangeSet changeSet = new ChangeSet();
-    changeSet.added(source);
+    changeSet.addedSource(source);
     _analysisContext.applyChanges(changeSet);
     return source;
   }
 
   /**
+   * Add a source file to the content provider.
+   *
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addSource(String contents) => addNamedSource("/test.dart", contents);
+
+  /**
    * Assert that the number of errors reported against the given source matches the number of errors
    * that are given and that they have the expected error codes. The order in which the errors were
    * gathered is ignored.
@@ -9382,7 +9382,7 @@
     for (AnalysisError error in _analysisContext.computeErrors(source)) {
       errorListener.onError(error);
     }
-    errorListener.assertErrors2(expectedErrorCodes);
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
   }
 
   /**
@@ -9416,7 +9416,7 @@
    *
    * @return the library element that was created
    */
-  LibraryElementImpl createTestLibrary() => createTestLibrary2(new AnalysisContextImpl(), "test", []);
+  LibraryElementImpl createDefaultTestLibrary() => createTestLibrary(new AnalysisContextImpl(), "test", []);
 
   /**
    * Create a library element that represents a library with the given name containing a single
@@ -9425,7 +9425,7 @@
    * @param libraryName the name of the library to be created
    * @return the library element that was created
    */
-  LibraryElementImpl createTestLibrary2(AnalysisContext context, String libraryName, List<String> typeNames) {
+  LibraryElementImpl createTestLibrary(AnalysisContext context, String libraryName, List<String> typeNames) {
     int count = typeNames.length;
     List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<CompilationUnitElementImpl>(count);
     for (int i = 0; i < count; i++) {
@@ -9433,13 +9433,13 @@
       ClassElementImpl type = new ClassElementImpl(AstFactory.identifier3(typeName));
       String fileName = "${typeName}.dart";
       CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
-      compilationUnit.source = createSource2(fileName);
+      compilationUnit.source = createNamedSource(fileName);
       compilationUnit.types = <ClassElement> [type];
       sourcedCompilationUnits[i] = compilationUnit;
     }
     String fileName = "${libraryName}.dart";
     CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
-    compilationUnit.source = createSource2(fileName);
+    compilationUnit.source = createNamedSource(fileName);
     LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2([libraryName]));
     library.definingCompilationUnit = compilationUnit;
     library.parts = sourcedCompilationUnits;
@@ -9467,7 +9467,7 @@
   /**
    * Given a library and all of its parts, resolve the contents of the library and the contents of
    * the parts. This assumes that the sources for the library and its parts have already been added
-   * to the content provider using the method [addSource].
+   * to the content provider using the method [addNamedSource].
    *
    * @param librarySource the source for the compilation unit that defines the library
    * @return the element representing the resolved library
@@ -9508,7 +9508,7 @@
    * @param fileName the name of the file for which a source is to be created
    * @return the source that was created
    */
-  FileBasedSource createSource2(String fileName) {
+  FileBasedSource createNamedSource(String fileName) {
     FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
     _analysisContext.setContents(source, "");
     return source;
@@ -10532,7 +10532,7 @@
         errorListener.onError(error);
       }
     }
-    errorListener.assertErrors2(expectedErrorCodes);
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
   }
 
   void assertNoErrors(ClassElement classElt) {
@@ -10851,8 +10851,8 @@
         "library L;",
         "export 'lib1.dart';",
         "export 'lib2.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
     verify([source]);
@@ -10863,23 +10863,14 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "g() { return f(); }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
         CompileTimeErrorCode.UNDEFINED_FUNCTION]);
   }
 
-  void test_argumentDefinitionTestNonParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", " var v = 0;", " return ?v;", "}"]));
-    resolve(source);
-    assertErrors(source, [
-        ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST,
-        CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER]);
-    verify([source]);
-  }
-
   void test_builtInIdentifierAsMixinName_classTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class as = A with B;"]));
     resolve(source);
@@ -11395,8 +11386,8 @@
   }
 
   void test_constWithNonType_fromLibrary() {
-    Source source1 = addSource2("lib.dart", "");
-    Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
+    Source source1 = addNamedSource("lib.dart", "");
+    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
         "import 'lib.dart' as lib;",
         "void f() {",
         "  const lib.A();",
@@ -11519,9 +11510,9 @@
   }
 
   void test_duplicateDefinition_acrossLibraries() {
-    Source librarySource = addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
-    Source sourceA = addSource2("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
-    Source sourceB = addSource2("/b.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
+    Source librarySource = addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
+    Source sourceA = addNamedSource("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
+    Source sourceB = addNamedSource("/b.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
     resolve(librarySource);
     assertErrors(sourceB, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([librarySource, sourceA, sourceB]);
@@ -11669,7 +11660,7 @@
 
   void test_exportOfNonLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
     verify([source]);
@@ -12126,7 +12117,7 @@
 
   void test_importOfNonLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addSource2("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
     verify([source]);
@@ -12267,7 +12258,7 @@
   }
 
   void test_invalidAnnotation_importWithPrefix_getter() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "get V => 0;"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "get V => 0;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
@@ -12275,7 +12266,7 @@
   }
 
   void test_invalidAnnotation_importWithPrefix_notConstantVariable() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "final V = 0;"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "final V = 0;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
@@ -12283,7 +12274,7 @@
   }
 
   void test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef V();"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef V();"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
@@ -13056,14 +13047,14 @@
 
   void test_partOfNonPart() {
     Source source = addSource(EngineTestCase.createSource(["library l1;", "part 'l2.dart';"]));
-    addSource2("/l2.dart", EngineTestCase.createSource(["library l2;"]));
+    addNamedSource("/l2.dart", EngineTestCase.createSource(["library l2;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
     verify([source]);
   }
 
   void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "typedef p();", "p.A a;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
@@ -13071,7 +13062,7 @@
   }
 
   void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "p() {}", "p.A a;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
@@ -13079,7 +13070,7 @@
   }
 
   void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "var p = null;", "p.A a;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
@@ -13087,7 +13078,7 @@
   }
 
   void test_prefixCollidesWithTopLevelMembers_type() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "class p {}", "p.A a;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
@@ -13703,7 +13694,7 @@
 
   void test_undefinedFunction_hasImportPrefix() {
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as f;", "main() { return f(); }"]));
-    addSource2("/lib.dart", "library lib;");
+    addNamedSource("/lib.dart", "library lib;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_FUNCTION]);
   }
@@ -13926,10 +13917,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_ambiguousImport_function);
       });
-      _ut.test('test_argumentDefinitionTestNonParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter);
-      });
       _ut.test('test_builtInIdentifierAsMixinName_classTypeAlias', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_builtInIdentifierAsMixinName_classTypeAlias);
@@ -15708,7 +15695,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classD.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(operator, resolve5(expression, []));
+    JUnitTestCase.assertSame(operator, resolveIndexExpression(expression, []));
     _listener.assertNoErrors();
   }
 
@@ -15743,7 +15730,7 @@
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
     BreakStatement statement = AstFactory.breakStatement2(label);
-    JUnitTestCase.assertSame(labelElement, resolve(statement, labelElement));
+    JUnitTestCase.assertSame(labelElement, resolveBreak(statement, labelElement));
     _listener.assertNoErrors();
   }
 
@@ -15779,7 +15766,7 @@
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
     ContinueStatement statement = AstFactory.continueStatement2(label);
-    JUnitTestCase.assertSame(labelElement, resolve3(statement, labelElement));
+    JUnitTestCase.assertSame(labelElement, resolveContinue(statement, labelElement));
     _listener.assertNoErrors();
   }
 
@@ -15836,7 +15823,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classA.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(getter, resolve5(expression, []));
+    JUnitTestCase.assertSame(getter, resolveIndexExpression(expression, []));
     _listener.assertNoErrors();
   }
 
@@ -15849,7 +15836,7 @@
     array.staticType = classA.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
     AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(setter, resolve5(expression, []));
+    JUnitTestCase.assertSame(setter, resolveIndexExpression(expression, []));
     _listener.assertNoErrors();
   }
 
@@ -16096,7 +16083,7 @@
 
   void test_visitSimpleIdentifier_dynamic() {
     SimpleIdentifier node = AstFactory.identifier3("dynamic");
-    resolve4(node, []);
+    resolveIdentifier(node, []);
     JUnitTestCase.assertSame(_typeProvider.dynamicType.element, node.staticElement);
     JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
     _listener.assertNoErrors();
@@ -16105,7 +16092,7 @@
   void test_visitSimpleIdentifier_lexicalScope() {
     SimpleIdentifier node = AstFactory.identifier3("i");
     VariableElementImpl element = ElementFactory.localVariableElement(node);
-    JUnitTestCase.assertSame(element, resolve4(node, [element]));
+    JUnitTestCase.assertSame(element, resolveIdentifier(node, [element]));
     _listener.assertNoErrors();
   }
 
@@ -16187,7 +16174,7 @@
    * @param labelElement the label element to be defined in the statement's label scope
    * @return the element to which the statement's label was resolved
    */
-  Element resolve(BreakStatement statement, LabelElementImpl labelElement) {
+  Element resolveBreak(BreakStatement statement, LabelElementImpl labelElement) {
     resolveStatement(statement, labelElement);
     return statement.label.staticElement;
   }
@@ -16200,7 +16187,7 @@
    * @param labelElement the label element to be defined in the statement's label scope
    * @return the element to which the statement's label was resolved
    */
-  Element resolve3(ContinueStatement statement, LabelElementImpl labelElement) {
+  Element resolveContinue(ContinueStatement statement, LabelElementImpl labelElement) {
     resolveStatement(statement, labelElement);
     return statement.label.staticElement;
   }
@@ -16214,21 +16201,7 @@
    *          being resolved
    * @return the element to which the expression was resolved
    */
-  Element resolve4(Identifier node, List<Element> definedElements) {
-    resolveNode(node, definedElements);
-    return node.staticElement;
-  }
-
-  /**
-   * Return the element associated with the given expression after the resolver has resolved the
-   * expression.
-   *
-   * @param node the expression to be resolved
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   * @return the element to which the expression was resolved
-   */
-  Element resolve5(IndexExpression node, List<Element> definedElements) {
+  Element resolveIdentifier(Identifier node, List<Element> definedElements) {
     resolveNode(node, definedElements);
     return node.staticElement;
   }
@@ -16259,6 +16232,20 @@
   }
 
   /**
+   * Return the element associated with the given expression after the resolver has resolved the
+   * expression.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  Element resolveIndexExpression(IndexExpression node, List<Element> definedElements) {
+    resolveNode(node, definedElements);
+    return node.staticElement;
+  }
+
+  /**
    * Return the element associated with the given identifier after the resolver has resolved the
    * identifier.
    *
@@ -16591,14 +16578,14 @@
   void test_import_referenceIntoLibDirectory() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/other.dart", "");
-    Source source = addSource2("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
     resolve(source);
     assertErrors(source, [PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
   }
 
   void test_import_referenceIntoLibDirectory_no_pubspec() {
     cacheSource("/myproj/lib/other.dart", "");
-    Source source = addSource2("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -16606,14 +16593,14 @@
   void test_import_referenceOutOfLibDirectory() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/web/other.dart", "");
-    Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
     resolve(source);
     assertErrors(source, [PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
   }
 
   void test_import_referenceOutOfLibDirectory_no_pubspec() {
     cacheSource("/myproj/web/other.dart", "");
-    Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -16621,7 +16608,7 @@
   void test_import_valid_inside_lib1() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/other.dart", "");
-    Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import 'other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import 'other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -16629,7 +16616,7 @@
   void test_import_valid_inside_lib2() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/bar/other.dart", "");
-    Source source = addSource2("/myproj/lib/foo/test.dart", EngineTestCase.createSource(["import '../bar/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/foo/test.dart", EngineTestCase.createSource(["import '../bar/other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -16637,7 +16624,7 @@
   void test_import_valid_outside_lib() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/web/other.dart", "");
-    Source source = addSource2("/myproj/lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -16716,8 +16703,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "f(p) {p as N;}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16727,8 +16714,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "class A extends N {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -16740,8 +16727,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "class A implements N {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -16754,9 +16741,9 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "part 'part.dart';"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    Source partSource = addSource2("/part.dart", EngineTestCase.createSource(["part of lib;", "class A extends N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source partSource = addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A extends N {}"]));
     resolve(source);
     assertErrors(partSource, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -16769,8 +16756,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "f() {new N();}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16780,8 +16767,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "f(p) {p is N;}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16791,8 +16778,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "g() { N.FOO; }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16810,8 +16797,8 @@
         "  N m() { return null; }",
         "}",
         "class B<T extends N> {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -16829,8 +16816,8 @@
         "import 'lib2.dart';",
         "class A<T> {}",
         "A<N> f() { return null; }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16841,8 +16828,8 @@
         "import 'lib2.dart';",
         "class A<T> {}",
         "f() {new A<N>();}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16853,8 +16840,8 @@
         "import 'lib2.dart';",
         "f() { g(v); }",
         "g(p) {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -16864,8 +16851,8 @@
         "import 'lib1.dart';",
         "import 'lib2.dart';",
         "f() { v = 0; }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
@@ -17145,6 +17132,19 @@
     verify([source]);
   }
 
+  void test_assignmentToConst_instanceVariable_plusEq() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static const v = 0;",
+        "}",
+        "f() {",
+        "  A.v += 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+
   void test_assignmentToConst_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  const x = 0;", "  x = 1;", "}"]));
     resolve(source);
@@ -17152,6 +17152,13 @@
     verify([source]);
   }
 
+  void test_assignmentToConst_localVariable_plusEq() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  const x = 0;", "  x += 1;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+
   void test_assignmentToFinal_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -17166,6 +17173,20 @@
     verify([source]);
   }
 
+  void test_assignmentToFinal_instanceVariable_plusEq() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final v = 0;",
+        "}",
+        "f() {",
+        "  A a = new A();",
+        "  a.v += 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
   void test_assignmentToFinal_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x = 1;", "}"]));
     resolve(source);
@@ -17173,6 +17194,13 @@
     verify([source]);
   }
 
+  void test_assignmentToFinal_localVariable_plusEq() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x += 1;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
   void test_assignmentToFinal_prefixMinusMinus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  --x;", "}"]));
     resolve(source);
@@ -17272,7 +17300,7 @@
         "import 'dart:async';",
         "Future f = null;",
         "Stream s;"]));
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class Future {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class Future {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
@@ -17370,7 +17398,7 @@
   }
 
   void test_conflictingInstanceMethodSetter_sameClass() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  foo() {}", "  set foo(a) {}", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set foo(a) {}", "  foo() {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
     verify([source]);
@@ -17402,6 +17430,13 @@
     verify([source]);
   }
 
+  void test_conflictingInstanceMethodSetter2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  foo() {}", "  set foo(a) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2]);
+    verify([source]);
+  }
+
   void test_conflictingInstanceSetterAndSuperclassMember() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -17495,8 +17530,8 @@
         "library test;",
         "export 'lib1.dart';",
         "export 'lib2.dart';"]));
-    addSource2("/lib1.dart", "library lib;");
-    addSource2("/lib2.dart", "library lib;");
+    addNamedSource("/lib1.dart", "library lib;");
+    addNamedSource("/lib2.dart", "library lib;");
     resolve(source);
     assertErrors(source, [StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME]);
     verify([source]);
@@ -17633,8 +17668,8 @@
         "library test;",
         "import 'lib1.dart';",
         "import 'lib2.dart';"]));
-    addSource2("/lib1.dart", "library lib;");
-    addSource2("/lib2.dart", "library lib;");
+    addNamedSource("/lib1.dart", "library lib;");
+    addNamedSource("/lib2.dart", "library lib;");
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME,
@@ -18289,8 +18324,8 @@
   }
 
   void test_newWithNonType_fromLibrary() {
-    Source source1 = addSource2("lib.dart", "class B {}");
-    Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
+    Source source1 = addNamedSource("lib.dart", "class B {}");
+    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
         "import 'lib.dart' as lib;",
         "void f() {",
         "  var a = new lib.A();",
@@ -18623,7 +18658,7 @@
 
   void test_partOfDifferentLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
-    addSource2("/part.dart", EngineTestCase.createSource(["part of lub;"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lub;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
     verify([source]);
@@ -18842,8 +18877,8 @@
   }
 
   void test_undefinedGetter_fromLibrary() {
-    Source source1 = addSource2("lib.dart", "");
-    Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
+    Source source1 = addNamedSource("lib.dart", "");
+    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
         "import 'lib.dart' as lib;",
         "void f() {",
         "  var g = lib.gg;",
@@ -18867,7 +18902,7 @@
   }
 
   void test_undefinedIdentifier_function_prefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "int a() => b;", "b.C c;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
@@ -18881,7 +18916,7 @@
   }
 
   void test_undefinedIdentifier_initializer_prefix() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "var a = b;", "b.C c;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
@@ -18894,7 +18929,7 @@
   }
 
   void test_undefinedIdentifier_private_getter() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart';",
         "class B extends A {",
@@ -18907,7 +18942,7 @@
   }
 
   void test_undefinedIdentifier_private_setter() {
-    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart';",
         "class B extends A {",
@@ -18926,8 +18961,8 @@
   }
 
   void test_undefinedSetter() {
-    Source source1 = addSource2("lib.dart", "");
-    Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
+    Source source1 = addNamedSource("lib.dart", "");
+    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
         "import 'lib.dart' as lib;",
         "void f() {",
         "  lib.gg = null;",
@@ -19134,18 +19169,34 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToConst_instanceVariable);
       });
+      _ut.test('test_assignmentToConst_instanceVariable_plusEq', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToConst_instanceVariable_plusEq);
+      });
       _ut.test('test_assignmentToConst_localVariable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToConst_localVariable);
       });
+      _ut.test('test_assignmentToConst_localVariable_plusEq', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToConst_localVariable_plusEq);
+      });
       _ut.test('test_assignmentToFinal_instanceVariable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_instanceVariable);
       });
+      _ut.test('test_assignmentToFinal_instanceVariable_plusEq', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_instanceVariable_plusEq);
+      });
       _ut.test('test_assignmentToFinal_localVariable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_localVariable);
       });
+      _ut.test('test_assignmentToFinal_localVariable_plusEq', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToFinal_localVariable_plusEq);
+      });
       _ut.test('test_assignmentToFinal_prefixMinusMinus', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_prefixMinusMinus);
@@ -19218,6 +19269,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_field);
       });
+      _ut.test('test_conflictingInstanceMethodSetter2', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceMethodSetter2);
+      });
       _ut.test('test_conflictingInstanceMethodSetter_sameClass', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_conflictingInstanceMethodSetter_sameClass);
@@ -19822,7 +19877,7 @@
   Source addSource(String path, String code) {
     Source source = new FileBasedSource.con1(FileUtilities2.createFile(path));
     ChangeSet changeSet = new ChangeSet();
-    changeSet.added(source);
+    changeSet.addedSource(source);
     context.applyChanges(changeSet);
     context.setContents(source, code);
     return source;
@@ -20378,13 +20433,13 @@
     ClassElement typeB1 = ElementFactory.classElement2(typeNameB, []);
     ClassElement typeB2 = ElementFactory.classElement2(typeNameB, []);
     ClassElement typeC = ElementFactory.classElement2(typeNameC, []);
-    LibraryElement importedLibrary1 = createTestLibrary2(context, "imported1", []);
+    LibraryElement importedLibrary1 = createTestLibrary(context, "imported1", []);
     (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB1];
     ImportElementImpl import1 = ElementFactory.importFor(importedLibrary1, null, []);
-    LibraryElement importedLibrary2 = createTestLibrary2(context, "imported2", []);
+    LibraryElement importedLibrary2 = createTestLibrary(context, "imported2", []);
     (importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeB2, typeC];
     ImportElementImpl import2 = ElementFactory.importFor(importedLibrary2, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
     importingLibrary.imports = <ImportElement> [import1, import2];
     {
       GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -20394,7 +20449,7 @@
       JUnitTestCase.assertEquals(typeC, scope.lookup(AstFactory.identifier3(typeNameC), importingLibrary));
       errorListener.assertNoErrors();
       Element element = scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary);
-      errorListener.assertErrors2([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
       EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
       List<Element> conflictingElements = (element as MultiplyDefinedElement).conflictingElements;
       EngineTestCase.assertLength(2, conflictingElements);
@@ -20412,13 +20467,13 @@
       Identifier identifier = AstFactory.identifier3(typeNameB);
       AstFactory.methodDeclaration(null, AstFactory.typeName3(identifier, []), null, null, AstFactory.identifier3("foo"), null);
       Element element = scope.lookup(identifier, importingLibrary);
-      errorListener.assertErrors2([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
       EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
     }
   }
 
   void test_creation_empty() {
-    LibraryElement definingLibrary = createTestLibrary();
+    LibraryElement definingLibrary = createDefaultTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     new LibraryImportScope(definingLibrary, errorListener);
   }
@@ -20428,9 +20483,9 @@
     context.sourceFactory = new SourceFactory([]);
     String importedTypeName = "A";
     ClassElement importedType = new ClassElementImpl(AstFactory.identifier3(importedTypeName));
-    LibraryElement importedLibrary = createTestLibrary2(context, "imported", []);
+    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
     (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
-    LibraryElementImpl definingLibrary = createTestLibrary2(context, "importing", []);
+    LibraryElementImpl definingLibrary = createTestLibrary(context, "importing", []);
     ImportElementImpl importElement = new ImportElementImpl(0);
     importElement.importedLibrary = importedLibrary;
     definingLibrary.imports = <ImportElement> [importElement];
@@ -20440,7 +20495,7 @@
   }
 
   void test_getErrorListener() {
-    LibraryElement definingLibrary = createTestLibrary();
+    LibraryElement definingLibrary = createDefaultTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
@@ -20450,16 +20505,16 @@
     AnalysisContext context = AnalysisContextFactory.contextWithCore();
     String typeName = "List";
     ClassElement type = ElementFactory.classElement2(typeName, []);
-    LibraryElement importedLibrary = createTestLibrary2(context, "lib", []);
+    LibraryElement importedLibrary = createTestLibrary(context, "lib", []);
     (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [type];
     ImportElementImpl importCore = ElementFactory.importFor(context.getLibraryElement(context.sourceFactory.forUri("dart:core")), null, []);
     ImportElementImpl importLib = ElementFactory.importFor(importedLibrary, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
     importingLibrary.imports = <ImportElement> [importCore, importLib];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(importingLibrary, errorListener);
     JUnitTestCase.assertEquals(type, scope.lookup(AstFactory.identifier3(typeName), importingLibrary));
-    errorListener.assertErrors2([StaticWarningCode.CONFLICTING_DART_IMPORT]);
+    errorListener.assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
 
   void test_nonConflictingImports_sameElement() {
@@ -20469,11 +20524,11 @@
     String typeNameB = "B";
     ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
     ClassElement typeB = ElementFactory.classElement2(typeNameB, []);
-    LibraryElement importedLibrary = createTestLibrary2(context, "imported", []);
+    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
     (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB];
     ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null, []);
     ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
     importingLibrary.imports = <ImportElement> [import1, import2];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(importingLibrary, errorListener);
@@ -20490,13 +20545,13 @@
     String prefixName = "p";
     ClassElement prefixedType = ElementFactory.classElement2(typeName, []);
     ClassElement nonPrefixedType = ElementFactory.classElement2(typeName, []);
-    LibraryElement prefixedLibrary = createTestLibrary2(context, "import.prefixed", []);
+    LibraryElement prefixedLibrary = createTestLibrary(context, "import.prefixed", []);
     (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [prefixedType];
     ImportElementImpl prefixedImport = ElementFactory.importFor(prefixedLibrary, ElementFactory.prefix(prefixName), []);
-    LibraryElement nonPrefixedLibrary = createTestLibrary2(context, "import.nonPrefixed", []);
+    LibraryElement nonPrefixedLibrary = createTestLibrary(context, "import.nonPrefixed", []);
     (nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [nonPrefixedType];
     ImportElementImpl nonPrefixedImport = ElementFactory.importFor(nonPrefixedLibrary, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
     importingLibrary.imports = <ImportElement> [prefixedImport, nonPrefixedImport];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(importingLibrary, errorListener);
@@ -20880,7 +20935,7 @@
 
 class LibraryScopeTest extends ResolverTestCase {
   void test_creation_empty() {
-    LibraryElement definingLibrary = createTestLibrary();
+    LibraryElement definingLibrary = createDefaultTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     new LibraryScope(definingLibrary, errorListener);
   }
@@ -20890,9 +20945,9 @@
     context.sourceFactory = new SourceFactory([]);
     String importedTypeName = "A";
     ClassElement importedType = new ClassElementImpl(AstFactory.identifier3(importedTypeName));
-    LibraryElement importedLibrary = createTestLibrary2(context, "imported", []);
+    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
     (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
-    LibraryElementImpl definingLibrary = createTestLibrary2(context, "importing", []);
+    LibraryElementImpl definingLibrary = createTestLibrary(context, "importing", []);
     ImportElementImpl importElement = new ImportElementImpl(0);
     importElement.importedLibrary = importedLibrary;
     definingLibrary.imports = <ImportElement> [importElement];
@@ -20902,7 +20957,7 @@
   }
 
   void test_getErrorListener() {
-    LibraryElement definingLibrary = createTestLibrary();
+    LibraryElement definingLibrary = createDefaultTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
@@ -21756,9 +21811,9 @@
     }
     Map<String, Type2> namedTypes = functionType.namedParameterTypes;
     if (expectedNamedTypes == null) {
-      EngineTestCase.assertSize2(0, namedTypes);
+      EngineTestCase.assertSizeOfMap(0, namedTypes);
     } else {
-      EngineTestCase.assertSize2(expectedNamedTypes.length, namedTypes);
+      EngineTestCase.assertSizeOfMap(expectedNamedTypes.length, namedTypes);
       for (MapEntry<String, Type2> entry in getMapEntrySet(expectedNamedTypes)) {
         JUnitTestCase.assertSame(entry.getValue(), namedTypes[entry.getKey()]);
       }
@@ -22245,7 +22300,7 @@
         "f() {",
         "  if(A.DEBUG) {}",
         "}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource([
+    addNamedSource("/lib2.dart", EngineTestCase.createSource([
         "library lib2;",
         "class A {",
         "  static const bool DEBUG = false;",
@@ -22262,7 +22317,7 @@
         "f() {",
         "  if(LIB.A.DEBUG) {}",
         "}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource([
+    addNamedSource("/lib2.dart", EngineTestCase.createSource([
         "library lib2;",
         "class A {",
         "  static const bool DEBUG = false;",
@@ -22362,7 +22417,7 @@
         "import 'lib1.dart' as one;",
         "A a;",
         "one.A a2;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -22375,7 +22430,7 @@
         "import 'lib1.dart' hide A;",
         "A a;",
         "B b;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -22388,7 +22443,7 @@
         "import 'lib1.dart' show A;",
         "A a;",
         "B b;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -22782,7 +22837,7 @@
 
   void test_unusedImport_annotationOnDirective() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "@A()", "import 'lib1.dart';"]));
-    Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A() {}", "}"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A() {}", "}"]));
     resolve(source);
     assertErrors(source, []);
     verify([source, source2]);
@@ -22797,8 +22852,8 @@
 
   void test_unusedImport_export() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class Two {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class Two {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -22806,9 +22861,9 @@
 
   void test_unusedImport_export_infiniteLoop() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
-    addSource2("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
+    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -22816,9 +22871,9 @@
 
   void test_unusedImport_export2() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Three three;"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
-    addSource2("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
+    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -22835,7 +22890,7 @@
         "    one.topLevelFunction();",
         "  }",
         "}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class One {}", "topLevelFunction() {}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class One {}", "topLevelFunction() {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -23088,7 +23143,7 @@
     VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
     scope.define(element1);
     scope.define(element2);
-    errorListener2.assertErrors3([ErrorSeverity.ERROR]);
+    errorListener2.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
   }
 
   void test_define_normal() {
@@ -23124,7 +23179,7 @@
 
   AnalysisErrorListener get errorListener => errorListener2;
 
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 
 class Scope_EnclosedScopeTest_test_define_normal extends Scope {
@@ -23134,7 +23189,7 @@
 
   AnalysisErrorListener get errorListener => errorListener3;
 
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 
 class LibraryElementBuilderTest extends EngineTestCase {
@@ -23295,7 +23350,7 @@
     LibraryElement element = builder.buildLibrary(library);
     GatheringErrorListener listener = new GatheringErrorListener();
     listener.addAll(resolver.errorListener);
-    listener.assertErrors2(expectedErrorCodes);
+    listener.assertErrorsWithCodes(expectedErrorCodes);
     return element;
   }
 
@@ -23341,7 +23396,7 @@
     VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
     scope.define(element1);
     scope.define(element2);
-    errorListener.assertErrors3([ErrorSeverity.ERROR]);
+    errorListener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
   }
 
   void test_define_normal() {
@@ -23405,7 +23460,7 @@
 
   ScopeTest_TestScope(this.errorListener);
 
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
 }
 
 class SimpleResolverTest extends ResolverTestCase {
@@ -23588,8 +23643,8 @@
   }
 
   void test_entryPoint_exported() {
-    addSource2("/two.dart", EngineTestCase.createSource(["library two;", "main() {}"]));
-    Source source = addSource2("/one.dart", EngineTestCase.createSource(["library one;", "export 'two.dart';"]));
+    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "main() {}"]));
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "export 'two.dart';"]));
     LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     FunctionElement main = library.entryPoint;
@@ -23600,7 +23655,7 @@
   }
 
   void test_entryPoint_local() {
-    Source source = addSource2("/one.dart", EngineTestCase.createSource(["library one;", "main() {}"]));
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "main() {}"]));
     LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     FunctionElement main = library.entryPoint;
@@ -23611,7 +23666,7 @@
   }
 
   void test_entryPoint_none() {
-    Source source = addSource2("/one.dart", EngineTestCase.createSource(["library one;"]));
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;"]));
     LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     JUnitTestCase.assertNull(library.entryPoint);
@@ -23701,16 +23756,16 @@
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(2, classes);
-    JUnitTestCase.assertFalse(classes[0].hasReferenceToSuper());
-    JUnitTestCase.assertTrue(classes[1].hasReferenceToSuper());
+    JUnitTestCase.assertFalse(classes[0].hasReferenceToSuper);
+    JUnitTestCase.assertTrue(classes[1].hasReferenceToSuper);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_import_hide() {
-    addSource2("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
-    addSource2("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
-    Source source = addSource2("lib3.dart", EngineTestCase.createSource([
+    addNamedSource("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
+    addNamedSource("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
+    Source source = addNamedSource("lib3.dart", EngineTestCase.createSource([
         "import 'lib1.dart' hide foo;",
         "import 'lib2.dart';",
         "",
@@ -23724,8 +23779,8 @@
   }
 
   void test_import_prefix() {
-    addSource2("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
-    Source source = addSource2("/one.dart", EngineTestCase.createSource([
+    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource([
         "library one;",
         "import 'two.dart' as _two;",
         "main() {",
@@ -23737,8 +23792,8 @@
   }
 
   void test_import_spaceInUri() {
-    addSource2("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
-    Source source = addSource2("app.dart", EngineTestCase.createSource([
+    addNamedSource("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
+    Source source = addNamedSource("app.dart", EngineTestCase.createSource([
         "import 'sub folder/lib.dart';",
         "",
         "main() {",
@@ -24479,7 +24534,7 @@
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
     Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    EngineTestCase.assertSize3(2, subtypesOfA);
+    EngineTestCase.assertSizeOfSet(2, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
   }
 
@@ -24501,9 +24556,9 @@
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     Set<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
     List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
-    EngineTestCase.assertSize3(4, subtypesOfA);
+    EngineTestCase.assertSizeOfSet(4, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
-    EngineTestCase.assertSize3(3, subtypesOfB);
+    EngineTestCase.assertSizeOfSet(3, subtypesOfB);
     EngineTestCase.assertContains(arraySubtypesOfB, [classC, classD, classE]);
   }
 
@@ -24514,7 +24569,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     _definingCompilationUnit.types = <ClassElement> [classA];
     Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
-    EngineTestCase.assertSize3(0, subtypesOfA);
+    EngineTestCase.assertSizeOfSet(0, subtypesOfA);
   }
 
   void test_computeAllSubtypes_oneSubtype() {
@@ -24527,7 +24582,7 @@
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
     Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    EngineTestCase.assertSize3(1, subtypesOfA);
+    EngineTestCase.assertSizeOfSet(1, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
   }
 
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 6413ba9..4b86c62 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -228,13 +228,13 @@
  * The class `TokenFactory` defines utility methods that can be used to create tokens.
  */
 class TokenFactory {
-  static Token token(Keyword keyword) => new KeywordToken(keyword, 0);
+  static Token tokenFromKeyword(Keyword keyword) => new KeywordToken(keyword, 0);
 
-  static Token token2(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
+  static Token tokenFromString(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
 
-  static Token token3(TokenType type) => new Token(type, 0);
+  static Token tokenFromType(TokenType type) => new Token(type, 0);
 
-  static Token token4(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
+  static Token tokenFromTypeAndString(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
 }
 
 /**
@@ -1048,7 +1048,7 @@
 
   void test_unclosedPairInInterpolation() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    scan2("'\${(}'", listener);
+    scanWithListener("'\${(}'", listener);
   }
 
   void assertComment(TokenType commentType, String source) {
@@ -1087,7 +1087,7 @@
    */
   void assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
-    scan2(source, listener);
+    scanWithListener(source, listener);
     listener.assertErrors([new AnalysisError.con2(null, expectedOffset, 1, expectedError, [source.codeUnitAt(expectedOffset)])]);
   }
 
@@ -1121,7 +1121,7 @@
 
   void assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
     GatheringErrorListener listener = new GatheringErrorListener();
-    scan2(source, listener);
+    scanWithListener(source, listener);
     listener.assertNoErrors();
     LineInfo info = listener.getLineInfo(new TestSource());
     JUnitTestCase.assertNotNull(info);
@@ -1205,12 +1205,12 @@
 
   Token scan(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Token token = scan2(source, listener);
+    Token token = scanWithListener(source, listener);
     listener.assertNoErrors();
     return token;
   }
 
-  Token scan2(String source, GatheringErrorListener listener) {
+  Token scanWithListener(String source, GatheringErrorListener listener) {
     Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
     Token result = scanner.tokenize();
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
@@ -1917,7 +1917,7 @@
     // "s + b;")
     scan("", "ab", "", "s + b;");
     assertTokens(-1, 1, ["s", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_delete_identifier_end() {
@@ -1925,7 +1925,7 @@
     // "a + b;")
     scan("a", "bs", "", " + b;");
     assertTokens(-1, 1, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_delete_identifier_middle() {
@@ -1933,7 +1933,7 @@
     // "as + b;")
     scan("a", "b", "", "s + b;");
     assertTokens(-1, 1, ["as", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_delete_mergeTokens() {
@@ -1941,7 +1941,7 @@
     // "ac;")
     scan("a", " + b + ", "", "c;");
     assertTokens(-1, 1, ["ac", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_afterIdentifier1() {
@@ -1950,7 +1950,7 @@
     scan("a", "", "bs", " + b;");
     assertTokens(-1, 1, ["abs", "+", "b", ";"]);
     assertReplaced(1, "+");
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_afterIdentifier2() {
@@ -1958,7 +1958,7 @@
     // "a + by;"
     scan("a + b", "", "y", ";");
     assertTokens(1, 3, ["a", "+", "by", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_beforeIdentifier() {
@@ -1966,7 +1966,7 @@
     // "a + xb;")
     scan("a + ", "", "x", "b;");
     assertTokens(1, 3, ["a", "+", "xb", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_beforeIdentifier_firstToken() {
@@ -1974,7 +1974,7 @@
     // "xa + b;"
     scan("", "", "x", "a + b;");
     assertTokens(-1, 1, ["xa", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_convertOneFunctionToTwo() {
@@ -1982,7 +1982,7 @@
     // "f() => 0; g() {}"
     scan("f()", "", " => 0; g()", " {}");
     assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_end() {
@@ -1990,7 +1990,7 @@
     // "class A {} class B {}"
     scan("class A {}", "", " class B {}", "");
     assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_insideIdentifier() {
@@ -1998,7 +1998,7 @@
     // "cow.b;"
     scan("co", "", "w.", "b;");
     assertTokens(-1, 3, ["cow", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_newIdentifier1() {
@@ -2006,7 +2006,7 @@
     // "a; b c;"
     scan("a; ", "", "b", " c;");
     assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_newIdentifier2() {
@@ -2015,7 +2015,7 @@
     scan("a;", "", "b", "  c;");
     assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
     assertReplaced(1, ";");
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_period() {
@@ -2030,7 +2030,7 @@
     // "a. b;"
     scan("a", "", ".", " b;");
     assertTokens(0, 2, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_period_betweenIdentifiers2() {
@@ -2045,7 +2045,7 @@
     // "a . b;"
     scan("a ", "", ".", " b;");
     assertTokens(0, 2, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_period_insideExistingIdentifier() {
@@ -2053,7 +2053,7 @@
     // "a.b;"
     scan("a", "", ".", "b;");
     assertTokens(-1, 3, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_periodAndIdentifier() {
@@ -2068,7 +2068,7 @@
     // " a + b;"
     scan("", "", " ", "a + b;");
     assertTokens(0, 1, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_betweenTokens() {
@@ -2076,7 +2076,7 @@
     // "a  + b;"
     scan("a ", "", " ", "+ b;");
     assertTokens(1, 2, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_end_afterToken() {
@@ -2084,7 +2084,7 @@
     // "a + b; "
     scan("a + b;", "", " ", "");
     assertTokens(3, 4, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_end_afterWhitespace() {
@@ -2092,7 +2092,7 @@
     // "a + b;  "
     scan("a + b; ", "", " ", "");
     assertTokens(3, 4, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_withMultipleComments() {
@@ -2100,7 +2100,7 @@
     // "//comment", "//comment2", "a  + b;"
     scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
     assertTokens(1, 2, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_identifier_beginning() {
@@ -2108,7 +2108,7 @@
     // "fell + b;")
     scan("", "b", "f", "ell + b;");
     assertTokens(-1, 1, ["fell", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_identifier_end() {
@@ -2116,7 +2116,7 @@
     // "belt + b;")
     scan("bel", "l", "t", " + b;");
     assertTokens(-1, 1, ["belt", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_identifier_middle() {
@@ -2124,7 +2124,7 @@
     // "frost + b;")
     scan("f", "ir", "ro", "st + b;");
     assertTokens(-1, 1, ["frost", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_multiple_partialFirstAndLast() {
@@ -2132,7 +2132,7 @@
     // "ab * ab;")
     scan("a", "a + b", "b * a", "b;");
     assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_operator_oneForMany() {
@@ -2140,7 +2140,7 @@
     // "a * c - b;")
     scan("a ", "+", "* c -", " b;");
     assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_operator_oneForOne() {
@@ -2148,7 +2148,7 @@
     // "a * b;")
     scan("a ", "+", "*", " b;");
     assertTokens(0, 2, ["a", "*", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_tokenMap() {
@@ -2164,7 +2164,7 @@
       JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
       oldToken = oldToken.next;
     }
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange());
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   /**
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 2263acd..cdcbabb 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -106,7 +106,7 @@
    * @throws AssertionFailedError if a different number of errors have been gathered than were
    *           expected
    */
-  void assertErrors2(List<ErrorCode> expectedErrorCodes) {
+  void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
     JavaStringBuilder builder = new JavaStringBuilder();
     //
     // Verify that the expected error codes have a non-empty message.
@@ -206,7 +206,7 @@
    * @throws AssertionFailedError if a different number of errors have been gathered than were
    *           expected
    */
-  void assertErrors3(List<ErrorSeverity> expectedSeverities) {
+  void assertErrorsWithSeverities(List<ErrorSeverity> expectedSeverities) {
     int expectedErrorCount = 0;
     int expectedWarningCount = 0;
     for (ErrorSeverity severity in expectedSeverities) {
@@ -275,7 +275,7 @@
    *
    * @return `true` if at least one error has been gathered
    */
-  bool hasErrors() => _errors.length > 0;
+  bool get hasErrors => _errors.length > 0;
 
   void onError(AnalysisError error) {
     if (_rawSource != null) {
@@ -297,23 +297,13 @@
   }
 
   /**
-   * Set the line information associated with the given source to the given information.
-   *
-   * @param source the source with which the line information is associated
-   * @param lineInfo the line information to be associated with the source
-   */
-  void setLineInfo2(Source source, LineInfo lineInfo) {
-    _lineInfoMap[source] = lineInfo;
-  }
-
-  /**
    * Return `true` if the two errors are equivalent.
    *
    * @param firstError the first error being compared
    * @param secondError the second error being compared
    * @return `true` if the two errors are equivalent
    */
-  bool equals5(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals6(firstError.source, secondError.source);
+  bool equalErrors(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equalSources(firstError.source, secondError.source);
 
   /**
    * Return `true` if the two sources are equivalent.
@@ -322,7 +312,7 @@
    * @param secondSource the second source being compared
    * @return `true` if the two sources are equivalent
    */
-  bool equals6(Source firstSource, Source secondSource) {
+  bool equalSources(Source firstSource, Source secondSource) {
     if (firstSource == null) {
       return secondSource == null;
     } else if (secondSource == null) {
@@ -406,7 +396,7 @@
    */
   bool foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
     for (AnalysisError error in errors) {
-      if (equals5(error, targetError)) {
+      if (equalErrors(error, targetError)) {
         errors.remove(error);
         return true;
       }
@@ -475,7 +465,7 @@
     }
     List<bool> found = new List<bool>.filled(expectedSize, false);
     for (int i = 0; i < expectedSize; i++) {
-      assertContains2(array, found, expectedElements[i]);
+      privateAssertContains(array, found, expectedElements[i]);
     }
   }
 
@@ -539,30 +529,6 @@
   }
 
   /**
-   * Assert that the given list is non-`null` and has exactly expected elements.
-   *
-   * @param list the list being tested
-   * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the list is `null` or does not have the expected elements
-   */
-  static void assertExactElements(List list, List<Object> expectedElements) {
-    int expectedSize = expectedElements.length;
-    if (list == null) {
-      JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
-    }
-    if (list.length != expectedSize) {
-      JUnitTestCase.fail("Expected list of size ${expectedSize}; contained ${list.length} elements");
-    }
-    for (int i = 0; i < expectedSize; i++) {
-      Object element = list[i];
-      Object expectedElement = expectedElements[i];
-      if (element != expectedElement) {
-        JUnitTestCase.fail("Expected ${expectedElement} at [${i}]; found ${element}");
-      }
-    }
-  }
-
-  /**
    * Assert that the given array is non-`null` and has exactly expected elements.
    *
    * @param array the array being tested
@@ -570,7 +536,7 @@
    * @throws AssertionFailedError if the array is `null` or does not have the expected
    *           elements
    */
-  static void assertExactElements2(List<Object> array, List<Object> expectedElements) {
+  static void assertExactElementsInArray(List<Object> array, List<Object> expectedElements) {
     int expectedSize = expectedElements.length;
     if (array == null) {
       JUnitTestCase.fail("Expected array of size ${expectedSize}; found null");
@@ -590,11 +556,35 @@
   /**
    * Assert that the given list is non-`null` and has exactly expected elements.
    *
+   * @param list the list being tested
+   * @param expectedElements the expected elements
+   * @throws AssertionFailedError if the list is `null` or does not have the expected elements
+   */
+  static void assertExactElementsInList(List list, List<Object> expectedElements) {
+    int expectedSize = expectedElements.length;
+    if (list == null) {
+      JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
+    }
+    if (list.length != expectedSize) {
+      JUnitTestCase.fail("Expected list of size ${expectedSize}; contained ${list.length} elements");
+    }
+    for (int i = 0; i < expectedSize; i++) {
+      Object element = list[i];
+      Object expectedElement = expectedElements[i];
+      if (element != expectedElement) {
+        JUnitTestCase.fail("Expected ${expectedElement} at [${i}]; found ${element}");
+      }
+    }
+  }
+
+  /**
+   * Assert that the given list is non-`null` and has exactly expected elements.
+   *
    * @param set the list being tested
    * @param expectedElements the expected elements
    * @throws AssertionFailedError if the list is `null` or does not have the expected elements
    */
-  static void assertExactElements3(Set set, List<Object> expectedElements) {
+  static void assertExactElementsInSet(Set set, List<Object> expectedElements) {
     int expectedSize = expectedElements.length;
     if (set == null) {
       JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
@@ -668,7 +658,7 @@
    * @throws AssertionFailedError if the list is `null` or does not have the expected number
    *           of elements
    */
-  static void assertSize(int expectedSize, List list) {
+  static void assertSizeOfList(int expectedSize, List list) {
     if (list == null) {
       JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
     } else if (list.length != expectedSize) {
@@ -684,7 +674,7 @@
    * @throws AssertionFailedError if the map is `null` or does not have the expected number of
    *           elements
    */
-  static void assertSize2(int expectedSize, Map map) {
+  static void assertSizeOfMap(int expectedSize, Map map) {
     if (map == null) {
       JUnitTestCase.fail("Expected map of size ${expectedSize}; found null");
     } else if (map.length != expectedSize) {
@@ -700,7 +690,7 @@
    * @throws AssertionFailedError if the set is `null` or does not have the expected number of
    *           elements
    */
-  static void assertSize3(int expectedSize, Set set) {
+  static void assertSizeOfSet(int expectedSize, Set set) {
     if (set == null) {
       JUnitTestCase.fail("Expected set of size ${expectedSize}; found null");
     } else if (set.length != expectedSize) {
@@ -734,7 +724,29 @@
     return node.getAncestor(predicate);
   }
 
-  static void assertContains2(List<Object> array, List<bool> found, Object element) {
+  /**
+   * Calculate the offset where the given strings differ.
+   *
+   * @param str1 the first String to compare
+   * @param str2 the second String to compare
+   * @return the offset at which the strings differ (or <code>-1</code> if they do not)
+   */
+  static int getDiffPos(String str1, String str2) {
+    int len1 = Math.min(str1.length, str2.length);
+    int diffPos = -1;
+    for (int i = 0; i < len1; i++) {
+      if (str1.codeUnitAt(i) != str2.codeUnitAt(i)) {
+        diffPos = i;
+        break;
+      }
+    }
+    if (diffPos == -1 && str1.length != str2.length) {
+      diffPos = len1;
+    }
+    return diffPos;
+  }
+
+  static void privateAssertContains(List<Object> array, List<bool> found, Object element) {
     if (element == null) {
       for (int i = 0; i < array.length; i++) {
         if (!found[i]) {
@@ -758,28 +770,6 @@
     }
   }
 
-  /**
-   * Calculate the offset where the given strings differ.
-   *
-   * @param str1 the first String to compare
-   * @param str2 the second String to compare
-   * @return the offset at which the strings differ (or <code>-1</code> if they do not)
-   */
-  static int getDiffPos(String str1, String str2) {
-    int len1 = Math.min(str1.length, str2.length);
-    int diffPos = -1;
-    for (int i = 0; i < len1; i++) {
-      if (str1.codeUnitAt(i) != str2.codeUnitAt(i)) {
-        diffPos = i;
-        break;
-      }
-    }
-    if (diffPos == -1 && str1.length != str2.length) {
-      diffPos = len1;
-    }
-    return diffPos;
-  }
-
   AnalysisContextImpl createAnalysisContext() {
     AnalysisContextImpl context = new AnalysisContextImpl();
     context.sourceFactory = new SourceFactory([]);
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index 8c30be3..633184a 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -5,21 +5,18 @@
 library barback.asset_cascade;
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'asset.dart';
 import 'asset_id.dart';
 import 'asset_node.dart';
 import 'asset_set.dart';
 import 'log.dart';
-import 'build_result.dart';
 import 'cancelable_future.dart';
 import 'errors.dart';
 import 'package_graph.dart';
 import 'phase.dart';
 import 'stream_pool.dart';
 import 'transformer.dart';
-import 'utils.dart';
 
 /// The asset cascade for an individual package.
 ///
@@ -53,60 +50,28 @@
 
   final _phases = <Phase>[];
 
-  /// A stream that emits a [BuildResult] each time the build is completed,
-  /// whether or not it succeeded.
-  ///
-  /// If an unexpected error in barback itself occurs, it will be emitted
-  /// through this stream's error channel.
-  Stream<BuildResult> get results => _resultsController.stream;
-  final _resultsController = new StreamController<BuildResult>.broadcast();
-
   /// 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
   /// the cascade, unrelated parts will continue building.
-  ///
-  /// This will not emit programming errors from barback itself. Those will be
-  /// emitted through the [results] stream's error channel.
   Stream<BarbackException> get errors => _errorsController.stream;
-  final _errorsController = new StreamController<BarbackException>.broadcast();
-
-  /// A stream that emits an event whenever this cascade becomes dirty.
-  ///
-  /// After this stream emits an event, [results] will emit an event once the
-  /// cascade is no longer dirty.
-  ///
-  /// This may emit events when the cascade was already dirty. Events are
-  /// emitted synchronously to ensure that the dirty state is thoroughly
-  /// propagated as soon as any assets are changed.
-  Stream get onDirty => _onDirtyPool.stream;
-  final _onDirtyPool = new StreamPool.broadcast();
-
-  /// A controller whose stream feeds into [_onDirtyPool].
-  final _onDirtyController = new StreamController.broadcast(sync: true);
+  final _errorsController =
+      new StreamController<BarbackException>.broadcast(sync: true);
 
   /// A stream that emits an event whenever any transforms in this cascade logs
   /// an entry.
   Stream<LogEntry> get onLog => _onLogPool.stream;
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
-  /// The errors that have occurred since the current build started.
+  /// Whether [this] is dirty and still has more processing to do.
+  bool get isDirty => _phases.any((phase) => phase.isDirty);
+
+  /// A stream that emits an event whenever [this] is no longer dirty.
   ///
-  /// This will be empty if no build is occurring.
-  Queue<BarbackException> _accumulatedErrors;
-
-  /// The number of errors that have been logged since the current build
-  /// started.
-  int _numLogErrors;
-
-  /// A future that completes when the currently running build process finishes.
-  ///
-  /// If no build it in progress, is `null`.
-  Future _processDone;
-
-  /// Whether any source assets have been updated or removed since processing
-  /// last began.
-  var _newChanges = false;
+  /// 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);
 
   /// Returns all currently-available output assets from this cascade.
   AssetSet get availableOutputs =>
@@ -116,17 +81,7 @@
   ///
   /// It loads source assets within [package] using [provider].
   AssetCascade(this.graph, this.package) {
-    _onDirtyPool.add(_onDirtyController.stream);
-    _addPhase(new Phase(this, [], package));
-
-    // Keep track of logged errors so we can know that the build failed.
-    onLog.listen((entry) {
-      if (entry.level == LogLevel.ERROR) {
-        // TODO(nweiz): keep track of stack chain.
-        _accumulatedErrors.add(
-            new TransformerException(entry.transform, entry.message, null));
-      }
-    });
+    _addPhase(new Phase(this, package));
   }
 
   /// Gets the asset identified by [id].
@@ -139,6 +94,7 @@
   Future<AssetNode> getAssetNode(AssetId id) {
     assert(id.package == package);
 
+    var oldLastPhase = _phases.last;
     // TODO(rnystrom): Waiting for the entire build to complete is unnecessary
     // in some cases. Should optimize:
     // * [id] may be generated before the compilation is finished. We should
@@ -147,19 +103,12 @@
     // * If [id] has never been generated and all active transformers provide
     //   metadata about the file names of assets it can emit, we can prove that
     //   none of them can emit [id] and fail early.
-    return _phases.last.getOutput(id).then((node) {
-      // If the requested asset is available, we can just return it.
-      if (node != null && node.state.isAvailable) return node;
-
-      if (_processDone != null) {
-        // If there's a build running, that build might generate the asset, so
-        // we wait for it to complete and then try again.
-        return _processDone.then((_) => getAssetNode(id));
-      }
-
-      // If the asset hasn't been built and nothing is building now, the asset
-      // won't be generated, so we return null.
-      return null;
+    return oldLastPhase.getOutput(id).then((node) {
+      // The last phase may have changed if [updateSources] was called after
+      // requesting the output. In that case, we want the output from the new
+      // last phase.
+      if (_phases.last == oldLastPhase) return node;
+      return getAssetNode(id);
     });
   }
 
@@ -222,7 +171,9 @@
         continue;
       }
 
-      _addPhase(_phases.last.addPhase(transformers[i]));
+      var phase = _phases.last.addPhase();
+      _addPhase(phase);
+      phase.updateTransformers(transformers[i]);
     }
 
     if (transformers.length == 0) {
@@ -242,69 +193,18 @@
   }
 
   void reportError(BarbackException error) {
-    _accumulatedErrors.add(error);
     _errorsController.add(error);
   }
 
-  /// Add [phase] to the end of [_phases] and watch its [onDirty] stream.
+  /// Add [phase] to the end of [_phases] and watch its streams.
   void _addPhase(Phase phase) {
-    _onDirtyPool.add(phase.onDirty);
     _onLogPool.add(phase.onLog);
-    phase.onDirty.listen((_) {
-      _newChanges = true;
-      _waitForProcess();
+    phase.onDone.listen((_) {
+      if (!isDirty) _onDoneController.add(null);
     });
+
     _phases.add(phase);
   }
 
-  /// Starts the build process asynchronously if there is work to be done.
-  ///
-  /// Returns a future that completes with the background processing is done.
-  /// If there is no work to do, returns a future that completes immediately.
-  /// All errors that occur during processing will be caught (and routed to the
-  /// [results] stream) before they get to the returned future, so it is safe
-  /// to discard it.
-  Future _waitForProcess() {
-    if (_processDone != null) return _processDone;
-
-    _accumulatedErrors = new Queue();
-    _numLogErrors = 0;
-    return _processDone = _process().then((_) {
-      // Report the build completion.
-      // TODO(rnystrom): Put some useful data in here.
-      _resultsController.add(
-          new BuildResult(_accumulatedErrors));
-      _processDone = null;
-      _accumulatedErrors = null;
-    });
-  }
-
-  /// Starts the background processing.
-  ///
-  /// Returns a future that completes when all assets have been processed.
-  Future _process() {
-    _newChanges = false;
-    return newFuture(() {
-      // Find the first phase that has work to do and do it.
-      var future;
-      for (var phase in _phases) {
-        future = phase.process();
-        if (future != null) break;
-      }
-
-      // If all phases are done and no new updates have come in, we're done.
-      if (future == null) {
-        // If changes have come in, start over.
-        if (_newChanges) return _process();
-
-        // Otherwise, everything is done.
-        return null;
-      }
-
-      // Process that phase and then loop onto the next.
-      return future.then((_) => _process());
-    });
-  }
-
   String toString() => "cascade for $package";
 }
diff --git a/pkg/barback/lib/src/asset_node.dart b/pkg/barback/lib/src/asset_node.dart
index c4aec84..5e79443 100644
--- a/pkg/barback/lib/src/asset_node.dart
+++ b/pkg/barback/lib/src/asset_node.dart
@@ -96,35 +96,13 @@
   Future whenRemoved(callback()) =>
     _waitForState((state) => state.isRemoved, (_) => callback());
 
-  /// Runs [callback] repeatedly until the node's asset has maintained the same
-  /// value for the duration.
+  /// Returns a [Future] that completes when [state] changes from its current
+  /// value to any other value.
   ///
-  /// This will run [callback] as soon as the asset is available (synchronously
-  /// if it's available immediately). If the [state] changes at all while
-  /// waiting for the Future returned by [callback] to complete, it will be
-  /// re-run as soon as it completes and the asset is available again. This will
-  /// continue until [state] doesn't change at all.
-  ///
-  /// If this asset is removed, this will throw an [AssetNotFoundException] as
-  /// soon as [callback]'s Future is finished running.
-  Future tryUntilStable(Future callback(Asset asset)) {
-    return whenAvailable((asset) {
-      var modifiedDuringCallback = false;
-      var subscription;
-      subscription = onStateChange.listen((_) {
-        modifiedDuringCallback = true;
-        subscription.cancel();
-      });
-
-      return callback(asset).then((result) {
-        subscription.cancel();
-
-        // If the asset was modified at all while running the callback, the
-        // result was invalid and we should try again.
-        if (modifiedDuringCallback) return tryUntilStable(callback);
-        return result;
-      });
-    });
+  /// The returned [Future] will contain the new state.
+  Future<AssetState> whenStateChanges() {
+    var startState = state;
+    return _waitForState((state) => state != startState, (state) => state);
   }
 
   /// Calls [callback] as soon as the node is in a state that matches [test].
diff --git a/pkg/barback/lib/src/asset_node_set.dart b/pkg/barback/lib/src/asset_node_set.dart
new file mode 100644
index 0000000..be897b9
--- /dev/null
+++ b/pkg/barback/lib/src/asset_node_set.dart
@@ -0,0 +1,24 @@
+// 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.asset_node_set;
+
+import 'package:collection/collection.dart';
+
+import 'asset_node.dart';
+
+/// A set of [AssetNode]s that automatically ensures that nodes are removed from
+/// the set as soon as they're marked as [AssetState.REMOVED].
+class AssetNodeSet extends DelegatingSet<AssetNode> {
+  AssetNodeSet()
+      : super(new Set());
+
+  bool add(AssetNode node) {
+    if (node.state.isRemoved) return false;
+    node.whenRemoved(() => super.remove(node));
+    return super.add(node);
+  }
+
+  void addAll(Iterable<AssetNode> nodes) => nodes.forEach(add);
+}
\ No newline at end of file
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/group_runner.dart
index 2e89416..69aaaa9 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/group_runner.dart
@@ -26,44 +26,47 @@
   /// The phases defined by this group.
   final _phases = new List<Phase>();
 
-  /// A stream that emits an event whenever this group becomes dirty and needs
-  /// to be run.
-  ///
-  /// This may emit events when the group was already dirty or while processing
-  /// transforms. Events are emitted synchronously to ensure that the dirty
-  /// state is thoroughly propagated as soon as any assets are changed.
-  Stream get onDirty => _onDirtyPool.stream;
-  final _onDirtyPool = new StreamPool.broadcast();
-
-  /// Whether this group is dirty and needs to be run.
+  /// Whether [this] is dirty and still has more processing to do.
   bool get isDirty => _phases.any((phase) => phase.isDirty);
 
+  /// A stream that emits an event whenever [this] is no longer dirty.
+  ///
+  /// 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);
+
+  /// 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>();
+
   /// A stream that emits an event whenever any transforms in this group logs
   /// an entry.
   Stream<LogEntry> get onLog => _onLogPool.stream;
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
-  // TODO(nweiz): move to a more push-based way of propagating outputs and get
-  // rid of this. Once that's done, see if we can unify GroupRunner and
-  // AssetCascade.
-  /// The set of outputs that has been returned by [process].
-  ///
-  /// [process] is expected to only return new outputs, so this is used to
-  /// ensure that it does so.
-  final _alreadyEmittedOutputs = new Set<AssetNode>();
-
   GroupRunner(AssetCascade cascade, this._group, this._location) {
-    var lastPhase = new Phase(cascade, _group.phases.first, _location);
-    _phases.add(lastPhase);
+    _addPhase(new Phase(cascade, _location), _group.phases.first);
     for (var phase in _group.phases.skip(1)) {
-      lastPhase = lastPhase.addPhase(phase);
-      _phases.add(lastPhase);
+      _addPhase(_phases.last.addPhase(), phase);
     }
+  }
 
-    for (var phase in _phases) {
-      _onDirtyPool.add(phase.onDirty);
-      _onLogPool.add(phase.onLog);
-    }
+  /// Add a phase with [contents] to [this]'s list of phases.
+  ///
+  /// [contents] should be an inner [Iterable] from a [TransformGroup.phases]
+  /// 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);
   }
 
   /// Force all [LazyTransformer]s' transforms in this group to begin producing
@@ -84,27 +87,5 @@
     _phases.first.remove();
   }
 
-  /// Processes this group.
-  ///
-  /// Returns a future that completes with any new outputs produced by the
-  /// group.
-  Future<Set<AssetNode>> process() {
-    // Process the first phase that needs to do work.
-    for (var phase in _phases) {
-      var future = phase.process();
-      if (future != null) return future.then((_) => process());
-    }
-
-    // If we get here, all phases are done processing.
-    var newOutputs = _phases.last.availableOutputs
-        .difference(_alreadyEmittedOutputs);
-    for (var output in newOutputs) {
-      output.whenRemoved(() => _alreadyEmittedOutputs.remove(output));
-    }
-    _alreadyEmittedOutputs.addAll(newOutputs);
-
-    return new Future.value(newOutputs);
-  }
-
   String toString() => "group in phase $_location for $_group";
 }
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/package_graph.dart
index 6e259e6..c503c60 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/package_graph.dart
@@ -5,6 +5,7 @@
 library barback.package_graph;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'asset_cascade.dart';
 import 'asset_id.dart';
@@ -28,12 +29,6 @@
   /// The [AssetCascade] for each package.
   final _cascades = <String, AssetCascade>{};
 
-  /// The current [BuildResult] for each package's [AssetCascade].
-  ///
-  /// The result for a given package will be `null` if that [AssetCascade] is
-  /// actively building.
-  final _cascadeResults = <String, BuildResult>{};
-
   /// A stream that emits a [BuildResult] each time the build is completed,
   /// whether or not it succeeded.
   ///
@@ -43,7 +38,8 @@
   /// If an unexpected error in barback itself occurs, it will be emitted
   /// through this stream's error channel.
   Stream<BuildResult> get results => _resultsController.stream;
-  final _resultsController = new StreamController<BuildResult>.broadcast();
+  final _resultsController =
+      new StreamController<BuildResult>.broadcast(sync: true);
 
   /// A stream that emits any errors from the graph or the transformers.
   ///
@@ -59,6 +55,23 @@
   Stream<LogEntry> get log => _logController.stream;
   final _logController = new StreamController<LogEntry>.broadcast(sync: true);
 
+  /// Whether [this] is dirty and still has more processing to do.
+  bool get _isDirty => _cascades.values.any((cascade) => cascade.isDirty);
+
+  /// Whether a [BuildResult] is scheduled to be emitted on [results] (see
+  /// [_tryScheduleResult]).
+  bool _resultScheduled = false;
+
+  /// The most recent [BuildResult] emitted on [results].
+  BuildResult _lastResult;
+
+  // TODO(nweiz): This can have bogus errors if an error is created and resolved
+  // in the space of one build.
+  /// The errors that have occurred since the current build started.
+  ///
+  /// This will be empty if no build is occurring.
+  final _accumulatedErrors = new Queue<BarbackException>();
+
   /// The most recent error emitted from a cascade's result stream.
   ///
   /// This is used to pipe an unexpected error from a build to the resulting
@@ -74,20 +87,14 @@
     _inErrorZone(() {
       for (var package in provider.packages) {
         var cascade = new AssetCascade(this, package);
-        // The initial result for each cascade is "success" since the cascade
-        // doesn't start building until some source in that graph is updated.
-        _cascadeResults[package] = new BuildResult.success();
         _cascades[package] = cascade;
-        cascade.onDirty.listen((_) {
-          _cascadeResults[package] = null;
-        });
-
         cascade.onLog.listen(_onLog);
-        _handleResults(cascade);
+        cascade.onDone.listen((_) => _tryScheduleResult());
       }
 
       _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors),
           broadcast: true);
+      _errors.listen(_accumulatedErrors.add);
     });
   }
 
@@ -119,7 +126,7 @@
       _inErrorZone(() => cascade.forceAllTransforms());
     }
 
-    if (_cascadeResults.values.contains(null)) {
+    if (_isDirty) {
       // A build is still ongoing, so wait for it to complete and try again.
       return results.first.then((_) => getAllAssets());
     }
@@ -131,10 +138,9 @@
       return new Future.error(error, _lastUnexpectedErrorTrace);
     }
 
-    // If the build completed with an error, complete the future with it.
-    var result = new BuildResult.aggregate(_cascadeResults.values);
-    if (!result.succeeded) {
-      return new Future.error(BarbackException.aggregate(result.errors));
+    // If the last build completed with an error, complete the future with it.
+    if (!_lastResult.succeeded) {
+      return new Future.error(BarbackException.aggregate(_lastResult.errors));
     }
 
     // Otherwise, return all of the final output assets.
@@ -155,6 +161,10 @@
       if (cascade == null) throw new ArgumentError("Unknown package $package.");
       _inErrorZone(() => cascade.updateSources(ids));
     });
+
+    // It's possible for adding sources not to cause any processing. The user
+    // still expects there to be a build, though, so we emit one immediately.
+    _tryScheduleResult();
   }
 
   /// Removes [removed] from the graph's known set of source assets.
@@ -164,15 +174,30 @@
       if (cascade == null) throw new ArgumentError("Unknown package $package.");
       _inErrorZone(() => cascade.removeSources(ids));
     });
+
+    // It's possible for removing sources not to cause any processing. The user
+    // still expects there to be a build, though, so we emit one immediately.
+    _tryScheduleResult();
   }
 
   void updateTransformers(String package,
       Iterable<Iterable<Transformer>> transformers) {
     _inErrorZone(() => _cascades[package].updateTransformers(transformers));
+
+    // It's possible for updating transformers not to cause any processing. The
+    // user still expects there to be a build, though, so we emit one
+    // immediately.
+    _tryScheduleResult();
   }
 
   /// A handler for a log entry from an [AssetCascade].
   void _onLog(LogEntry entry) {
+    if (entry.level == LogLevel.ERROR) {
+      // TODO(nweiz): keep track of stack chain.
+      _accumulatedErrors.add(
+          new TransformerException(entry.transform, entry.message, null));
+    }
+
     if (_logController.hasListener) {
       _logController.add(entry);
     } else if (entry.level != LogLevel.FINE) {
@@ -190,17 +215,24 @@
     }
   }
 
-  /// Listens to and handles the build results from [cascade].
-  void _handleResults(AssetCascade cascade) {
-    cascade.results.listen((result) {
-      _cascadeResults[cascade.package] = result;
-      // If any cascade hasn't yet finished, the overall build isn't finished
-      // either.
-      if (_cascadeResults.values.any((result) => result == null)) return;
+  /// If [this] is done processing, schedule a [BuildResult] to be emitted on
+  /// [results].
+  ///
+  /// This schedules the result (as opposed to just emitting one directly on
+  /// [BuildResult]) to ensure that calling multiple functions synchronously
+  /// produces only a single [BuildResult].
+  void _tryScheduleResult() {
+    if (_isDirty) return;
+    if (_resultScheduled) return;
 
-      // Include all build errors for all cascades. If no cascades have
-      // errors, the result will automatically be considered a success.
-      _resultsController.add(new BuildResult.aggregate(_cascadeResults.values));
+    _resultScheduled = true;
+    newFuture(() {
+      _resultScheduled = false;
+      if (_isDirty) return;
+
+      _lastResult = new BuildResult(_accumulatedErrors);
+      _accumulatedErrors.clear();
+      _resultsController.add(_lastResult);
     });
   }
 
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index 17d32d8..a240f06 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -9,6 +9,7 @@
 import 'asset_cascade.dart';
 import 'asset_id.dart';
 import 'asset_node.dart';
+import 'errors.dart';
 import 'group_runner.dart';
 import 'log.dart';
 import 'multiset.dart';
@@ -45,7 +46,7 @@
   /// The transformers that can access [inputs].
   ///
   /// Their outputs will be available to the next phase.
-  final Set<Transformer> _transformers;
+  final _transformers = new Set<Transformer>();
 
   /// The groups for this phase.
   final _groups = new Map<TransformerGroup, GroupRunner>();
@@ -77,35 +78,50 @@
   /// so, it's been forwarded unmodified.
   final _inputOrigins = new Multiset<AssetNode>();
 
-  /// A stream that emits an event whenever this phase becomes dirty and needs
-  /// to be run.
+  /// A stream that emits an event whenever [this] is no longer dirty.
   ///
-  /// This may emit events when the phase was already dirty or while processing
-  /// transforms. Events are emitted synchronously to ensure that the dirty
-  /// state is thoroughly propagated as soon as any assets are changed.
-  Stream get onDirty => _onDirtyPool.stream;
-  final _onDirtyPool = new StreamPool.broadcast();
+  /// 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);
 
-  /// A controller whose stream feeds into [_onDirtyPool].
+  /// A stream that emits any new assets emitted by [this].
   ///
-  /// This is used whenever an input is added or transforms are changed.
-  final _onDirtyController = new StreamController.broadcast(sync: true);
+  /// Assets are emitted synchronously to ensure that any changes are thoroughly
+  /// 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);
 
-  /// Whether this phase is dirty and needs to be run.
+  /// Whether [this] is dirty and still has more processing to do.
   bool get isDirty => _inputs.values.any((input) => input.isDirty) ||
       _groups.values.any((group) => group.isDirty);
 
+  /// Whether [this] or any previous phase is dirty.
+  bool get _isTransitivelyDirty => isDirty ||
+      (_previous != null && _previous._isTransitivelyDirty);
+
   /// A stream that emits an event whenever any transforms in this phase logs
   /// an entry.
   Stream<LogEntry> get onLog => _onLogPool.stream;
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
+  /// The previous phase in the cascade, or null if this is the first phase.
+  final Phase _previous;
+
   /// The phase after this one.
   ///
   /// Outputs from this phase will be passed to it.
   Phase get next => _next;
   Phase _next;
 
+  /// A map of asset ids to completers for [getInput] requests.
+  ///
+  /// If an asset node is requested before it's available, we put a completer in
+  /// this map to wait for the asset to be generated. If it's not generated, the
+  /// completer should complete to `null`.
+  final _pendingOutputRequests = new Map<AssetId, Completer<AssetNode>>();
+
   /// Returns all currently-available output assets for this phase.
   Set<AssetNode> get availableOutputs {
     return _outputs.values
@@ -117,18 +133,25 @@
   // TODO(nweiz): Rather than passing the cascade and the phase everywhere,
   // create an interface that just exposes [getInput]. Emit errors via
   // [AssetNode]s.
-  Phase(AssetCascade cascade, Iterable transformers, String location)
-      : this._(cascade, transformers, location, 0);
+  Phase(AssetCascade cascade, String location)
+      : this._(cascade, location, 0);
 
-  Phase._(this.cascade, Iterable transformers, this._location, this._index)
-      : _transformers = transformers.where((op) => op is Transformer).toSet() {
-    _onDirtyPool.add(_onDirtyController.stream);
+  Phase._(this.cascade, this._location, this._index, [this._previous]) {
+    // TODO(nweiz): This does O(n^2) work whenever a phase emits an [onDone]
+    // event, since each phase after it has to check each phase before. Find a
+    // better way to do this.
+    for (var phase = this; phase != null; phase = phase._previous) {
+      phase.onDone.listen((_) {
+        if (_isTransitivelyDirty) return;
 
-    for (var group in transformers.where((op) => op is TransformerGroup)) {
-      var runner = new GroupRunner(cascade, group, "$_location.$_index");
-      _groups[group] = runner;
-      _onDirtyPool.add(runner.onDirty);
-      _onLogPool.add(runner.onLog);
+        // All the previous phases have finished building. If anyone's still
+        // waiting for outputs, cut off the wait; we won't be generating them,
+        // at least until a source asset changes.
+        for (var completer in _pendingOutputRequests.values) {
+          completer.complete(null);
+        }
+        _pendingOutputRequests.clear();
+      });
     }
   }
 
@@ -151,12 +174,7 @@
     // there's one additional channel for the non-grouped transformers.
     var forwarder = new PhaseForwarder(_groups.length + 1);
     _forwarders[node.id] = forwarder;
-    forwarder.onForwarding.listen((asset) {
-      _addOutput(asset);
-
-      var exception = _outputs[asset.id].collisionException;
-      if (exception != null) cascade.reportError(exception);
-    });
+    forwarder.onAsset.listen(_handleOutputWithoutForwarder);
 
     _inputOrigins.add(node.origin);
     var input = new PhaseInput(this, node, _transformers, "$_location.$_index");
@@ -165,44 +183,85 @@
       _inputOrigins.remove(node.origin);
       _inputs.remove(node.id);
       _forwarders.remove(node.id).remove();
+      if (!isDirty) _onDoneController.add(null);
     });
-    _onDirtyPool.add(input.onDirty);
-    _onDirtyController.add(null);
+    input.onAsset.listen(_handleOutput);
     _onLogPool.add(input.onLog);
+    input.onDone.listen((_) {
+      if (!isDirty) _onDoneController.add(null);
+    });
 
     for (var group in _groups.values) {
       group.addInput(node);
     }
   }
 
+  // TODO(nweiz): If the input 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 an input with that ID cannot be found, returns null.
+  /// 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 newFuture(() {
+    return syncFuture(() {
       if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
-      if (_inputs.containsKey(id)) return _inputs[id].input;
-      return null;
+      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 an output with that ID cannot be found, returns null.
+  /// 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 output cannot be found, returns null.
   Future<AssetNode> getOutput(AssetId id) {
-    return newFuture(() {
+    return syncFuture(() {
       if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
-      if (!_outputs.containsKey(id)) return null;
-      var output = _outputs[id].output;
-      output.force();
-      return output;
+      if (_outputs.containsKey(id)) {
+        var output = _outputs[id].output;
+        // If the requested output is available, we can just return it.
+        if (output.state.isAvailable) return output;
+
+        // If the requested output exists but isn't yet available, wait to see
+        // if it becomes available. If it's removed before becoming available,
+        // try again, since it could be generated again.
+        output.force();
+        return output.whenAvailable((_) => output).catchError((error) {
+          if (error is! AssetNotFoundException) throw error;
+          return getOutput(id);
+        });
+      }
+
+      // If neither this phase nor the previous phases are dirty, the requested
+      // output won't be generated and we can safely return null.
+      if (!_isTransitivelyDirty) return null;
+
+      // Otherwise, store a completer for the asset node. If it's generated in
+      // the future, we'll complete this completer.
+      var completer = _pendingOutputRequests.putIfAbsent(id,
+          () => new Completer.sync());
+      return completer.future;
     });
   }
 
   /// Set this phase's transformers to [transformers].
   void updateTransformers(Iterable transformers) {
-    _onDirtyController.add(null);
-
     var actualTransformers = transformers.where((op) => op is Transformer);
     _transformers.clear();
     _transformers.addAll(actualTransformers);
@@ -220,8 +279,11 @@
     for (var added in newGroups.difference(oldGroups)) {
       var runner = new GroupRunner(cascade, added, "$_location.$_index");
       _groups[added] = runner;
-      _onDirtyPool.add(runner.onDirty);
+      runner.onAsset.listen(_handleOutput);
       _onLogPool.add(runner.onLog);
+      runner.onDone.listen((_) {
+        if (!isDirty) _onDoneController.add(null);
+      });
       for (var input in _inputs.values) {
         runner.addInput(input.input);
       }
@@ -244,12 +306,12 @@
     }
   }
 
-  /// Add a new phase after this one with [transformers].
+  /// Add a new phase after this one.
   ///
   /// This may only be called on a phase with no phase following it.
-  Phase addPhase(Iterable transformers) {
+  Phase addPhase() {
     assert(_next == null);
-    _next = new Phase._(cascade, transformers, _location, _index + 1);
+    _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
@@ -263,6 +325,7 @@
   ///
   /// This will remove all the phase's outputs and all following phases.
   void remove() {
+    if (_previous != null) _previous._next = null;
     removeFollowing();
     for (var input in _inputs.values.toList()) {
       input.remove();
@@ -270,7 +333,7 @@
     for (var group in _groups.values) {
       group.remove();
     }
-    _onDirtyPool.close();
+    _onAssetController.close();
     _onLogPool.close();
   }
 
@@ -281,61 +344,63 @@
     _next = null;
   }
 
-  /// Processes this phase.
-  ///
-  /// Returns a future that completes when processing is done. If there is
-  /// nothing to process, returns `null`.
-  Future process() {
-    if (!isDirty) return null;
-
-    var outputIds = new Set<AssetId>();
-    void _handleOutputs(Set<AssetNode> outputs) {
-      for (var asset in outputs) {
-        if (_inputOrigins.contains(asset.origin)) {
-          _forwarders[asset.id].addIntermediateAsset(asset);
-          continue;
-        }
-
-        outputIds.add(asset.id);
-        _addOutput(asset);
-      }
+  /// Add [asset] as an output of this phase.
+  void _handleOutput(AssetNode asset) {
+    if (_inputOrigins.contains(asset.origin)) {
+      _forwarders[asset.id].addIntermediateAsset(asset);
+    } else {
+      _handleOutputWithoutForwarder(asset);
     }
-
-    var outputFutures = [];
-    outputFutures.addAll(_inputs.values.map((input) {
-      if (!input.isDirty) return new Future.value(new Set());
-      return input.process().then(_handleOutputs);
-    }));
-    outputFutures.addAll(_groups.values.map((group) {
-      if (!group.isDirty) return new Future.value(new Set());
-      return group.process().then(_handleOutputs);
-    }));
-
-    return Future.wait(outputFutures).then((_) {
-      // Report collisions in a deterministic order.
-      outputIds = outputIds.toList();
-      outputIds.sort((a, b) => a.compareTo(b));
-      for (var id in outputIds) {
-        // It's possible the output was removed before other transforms in this
-        // phase finished.
-        if (!_outputs.containsKey(id)) continue;
-        var exception = _outputs[id].collisionException;
-        if (exception != null) cascade.reportError(exception);
-      }
-    });
   }
 
-  /// Add [asset] as an output of this phase.
-  void _addOutput(AssetNode asset) {
+  /// Add [asset] as an output of this phase without checking if it's a
+  /// forwarded asset.
+  void _handleOutputWithoutForwarder(AssetNode asset) {
     if (_outputs.containsKey(asset.id)) {
       _outputs[asset.id].add(asset);
     } else {
       _outputs[asset.id] = new PhaseOutput(this, asset, "$_location.$_index");
-      _outputs[asset.id].onAsset.listen((output) {
-        if (_next != null) _next.addInput(output);
-      }, onDone: () => _outputs.remove(asset.id));
-      if (_next != null) _next.addInput(_outputs[asset.id].output);
+      _outputs[asset.id].onAsset.listen(_emit,
+          onDone: () => _outputs.remove(asset.id));
+      _emit(_outputs[asset.id].output);
     }
+
+    var exception = _outputs[asset.id].collisionException;
+    if (exception != null) cascade.reportError(exception);
+  }
+
+  /// Emit [asset] as an output of this phase.
+  ///
+  /// 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);
+    }
+    _providePendingAsset(asset);
+  }
+
+  /// Provide an asset to a pending [getOutput] call.
+  void _providePendingAsset(AssetNode asset) {
+    // If anyone's waiting for this asset, provide it to them.
+    var request = _pendingOutputRequests.remove(asset.id);
+    if (request == null) return;
+
+    if (asset.state.isAvailable) {
+      request.complete(asset);
+      return;
+    }
+
+    // A lazy asset may be emitted while still dirty. If so, we wait until it's
+    // either available or removed before trying again to access it.
+    assert(asset.state.isDirty);
+    asset.force();
+    asset.whenStateChanges().then((state) {
+      if (state.isRemoved) return getOutput(asset.id);
+      return asset;
+    }).then(request.complete).catchError(request.completeError);
   }
 
   String toString() => "phase $_location.$_index";
diff --git a/pkg/barback/lib/src/phase_forwarder.dart b/pkg/barback/lib/src/phase_forwarder.dart
index c1f7abd..1d5682d 100644
--- a/pkg/barback/lib/src/phase_forwarder.dart
+++ b/pkg/barback/lib/src/phase_forwarder.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 
 import 'asset_node.dart';
+import 'asset_node_set.dart';
 
 /// A class that takes care of forwarding assets within a phase.
 ///
@@ -40,7 +41,7 @@
   int _numChannels;
 
   /// The intermediate forwarded assets.
-  final _intermediateAssets = new Set<AssetNode>();
+  final _intermediateAssets = new AssetNodeSet();
 
   /// The final forwarded asset.
   ///
@@ -53,9 +54,8 @@
   ///
   /// Whenever this stream emits an event, the value will be identical to
   /// [output].
-  Stream<AssetNode> get onForwarding => _onForwardingController.stream;
-  final _onForwardingController =
-      new StreamController<AssetNode>.broadcast(sync: true);
+  Stream<AssetNode> get onAsset => _onAssetController.stream;
+  final _onAssetController = new StreamController<AssetNode>(sync: true);
 
   PhaseForwarder(this._numChannels);
 
@@ -69,11 +69,7 @@
     }
 
     _intermediateAssets.add(asset);
-
-    asset.onStateChange.listen((state) {
-      if (state.isRemoved) _intermediateAssets.remove(asset);
-      _adjustOutput();
-    });
+    asset.onStateChange.listen((_) => _adjustOutput());
 
     _adjustOutput();
   }
@@ -86,7 +82,7 @@
       _outputController.setRemoved();
       _outputController = null;
     }
-    _onForwardingController.close();
+    _onAssetController.close();
   }
 
   /// Adjusts [output] to ensure that it accurately reflects the current state
@@ -112,7 +108,7 @@
           (asset) => asset.state.isDirty,
           orElse: () => _intermediateAssets.first);
       _outputController = new AssetNodeController.from(finalAsset);
-      _onForwardingController.add(output);
+      _onAssetController.add(output);
       return;
     }
 
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index d89aeda..5949a84 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -5,11 +5,10 @@
 library barback.phase_input;
 
 import 'dart:async';
-import 'dart:collection';
 
-import 'asset.dart';
 import 'asset_forwarder.dart';
 import 'asset_node.dart';
+import 'asset_node_set.dart';
 import 'errors.dart';
 import 'log.dart';
 import 'phase.dart';
@@ -45,42 +44,46 @@
   /// The asset node for this input.
   AssetNode get input => _inputForwarder.node;
 
-  /// The controller that's used for the output node if [input] isn't consumed
-  /// by any transformers.
+  /// The controller that's used for the output node if [input] isn't
+  /// overwritten by any transformers.
   ///
   /// This needs an intervening controller to ensure that the output can be
-  /// marked dirty when determining whether transforms apply, and removed if
-  /// they do. It's null if the asset is not being passed through.
+  /// marked dirty when determining whether transforms will overwrite it, and be
+  /// marked removed if they do. It's null if the asset is not being passed
+  /// through.
   AssetNodeController _passThroughController;
 
-  /// Whether [_passThroughController] has been newly created since [process]
-  /// last completed.
-  bool _newPassThrough = false;
-
-  /// A Future that will complete once the transformers that consume [input] are
-  /// determined.
-  Future _adjustTransformersFuture;
-
-  /// A stream that emits an event whenever this input becomes dirty and needs
-  /// [process] to be called.
+  /// A stream that emits an event whenever [this] is no longer dirty.
   ///
-  /// This may emit events when the input was already dirty or while processing
-  /// transforms. Events are emitted synchronously to ensure that the dirty
-  /// state is thoroughly propagated as soon as any assets are changed.
-  Stream get onDirty => _onDirtyPool.stream;
-  final _onDirtyPool = new StreamPool.broadcast();
+  /// 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);
 
-  /// A controller whose stream feeds into [_onDirtyPool].
+  /// A stream that emits any new assets emitted by [this].
   ///
-  /// This is used whenever the input is changed or removed. It's sometimes
-  /// redundant with the events collected from [_transforms], but this stream is
-  /// necessary for removed inputs, and the transform stream is necessary for
-  /// modified secondary inputs.
-  final _onDirtyController = new StreamController.broadcast(sync: true);
+  /// 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);
 
-  /// Whether this input is dirty and needs [process] to be called.
-  bool get isDirty => _adjustTransformersFuture != null ||
-      _newPassThrough || _transforms.any((transform) => transform.isDirty);
+  /// Whether [this] is dirty and still has more processing to do.
+  bool get isDirty => _isAdjustingTransformers ||
+      _transforms.any((transform) => transform.isDirty);
+
+  /// The set of assets emitted by the transformers for this input that have the
+  /// same id as [input].
+  final _overwritingOutputs = new AssetNodeSet();
+
+  /// Whether [this] has been rmeoved.
+  bool get _isRemoved => _onAssetController.isClosed;
+
+  /// Whether [input] has become dirty since [_adjustTransformers] last started
+  /// running.
+  bool _hasBecomeDirty = false;
+
+  /// Whether [_isAdjustingTransformers] is currently running.
+  bool _isAdjustingTransformers = false;
 
   /// A stream that emits an event whenever any transforms that use [input] as
   /// their primary input log an entry.
@@ -91,13 +94,11 @@
       this._location)
       : _transformers = transformers.toSet(),
         _inputForwarder = new AssetForwarder(input) {
-    _onDirtyPool.add(_onDirtyController.stream);
-
     input.onStateChange.listen((state) {
       if (state.isRemoved) {
         remove();
-      } else if (_adjustTransformersFuture == null) {
-        _adjustTransformers();
+      } else {
+        _dirty();
       }
     });
 
@@ -108,8 +109,9 @@
   ///
   /// This marks all outputs of the input as removed.
   void remove() {
-    _onDirtyController.add(null);
-    _onDirtyPool.close();
+    _onDoneController.close();
+    _hasBecomeDirty = false;
+    _onAssetController.close();
     _onLogPool.close();
     _inputForwarder.close();
     if (_passThroughController != null) {
@@ -118,36 +120,31 @@
     }
   }
 
+  /// Mark [this] as dirty and start re-running [_adjustTransformers] if
+  /// necessary.
+  void _dirty() {
+    // If there's a pass-through for this input, mark it dirty until we figure
+    // out if a transformer will emit an asset with that id.
+    if (_passThroughController != null) _passThroughController.setDirty();
+    _hasBecomeDirty = true;
+    if (!_isAdjustingTransformers) _adjustTransformers();
+  }
+
   /// Set this input's transformers to [transformers].
   void updateTransformers(Iterable<Transformer> newTransformersIterable) {
     var newTransformers = newTransformersIterable.toSet();
     var oldTransformers = _transformers.toSet();
-    for (var removedTransformer in
-         oldTransformers.difference(newTransformers)) {
+    var removedTransformers = oldTransformers.difference(newTransformers);
+    for (var removedTransformer in removedTransformers) {
       _transformers.remove(removedTransformer);
-
-      // If the transformers are being adjusted for [id], it will
-      // automatically pick up on [removedTransformer] being gone.
-      if (_adjustTransformersFuture != null) continue;
-
-      _transforms.removeWhere((transform) {
-        if (transform.transformer != removedTransformer) return false;
-        transform.remove();
-        return true;
-      });
-    }
-
-    if (_transforms.isEmpty && _adjustTransformersFuture == null &&
-        _passThroughController == null) {
-      _passThroughController = new AssetNodeController.from(input);
-      _newPassThrough = true;
     }
 
     var brandNewTransformers = newTransformers.difference(oldTransformers);
-    if (brandNewTransformers.isEmpty) return;
-
     brandNewTransformers.forEach(_transformers.add);
-    if (_adjustTransformersFuture == null) _adjustTransformers();
+
+    if (removedTransformers.isNotEmpty || brandNewTransformers.isNotEmpty) {
+      _dirty();
+    }
   }
 
   /// Force all [LazyTransformer]s' transforms in this input to begin producing
@@ -163,52 +160,63 @@
   ///
   /// This ensures that if [input] is modified or removed during or after the
   /// time it takes to adjust its transformers, they're appropriately
-  /// re-adjusted. Its progress can be tracked in [_adjustTransformersFuture].
+  /// re-adjusted.
   void _adjustTransformers() {
-    // Mark the input as dirty. This may not actually end up creating any new
-    // transforms, but we want adding or removing a source asset to consistently
-    // kick off a build, even if that build does nothing.
-    _onDirtyController.add(null);
+    assert(!_isRemoved);
 
-    // If there's a pass-through for this input, mark it dirty while we figure
-    // out whether we need to add any transforms for it.
-    if (_passThroughController != null) _passThroughController.setDirty();
+    _isAdjustingTransformers = true;
+    input.whenAvailable((asset) {
+      _hasBecomeDirty = false;
 
-    // Once the input is available, hook up transformers for it. If it changes
-    // while that's happening, try again.
-    _adjustTransformersFuture = _tryUntilStable((asset, transformers) {
+      // Take a snapshot of the existing transformers that apply to this input.
+      // Since [_removeStaleTransforms] will check each of these transformers to
+      // be sure [input] is still primary for them, we use this set to avoid
+      // needlessly re-checking in [_addFreshTransforms].
       var oldTransformers =
           _transforms.map((transform) => transform.transformer).toSet();
 
-      return _removeStaleTransforms(asset, transformers).then((_) =>
-          _addFreshTransforms(transformers, oldTransformers));
-    }).then((_) => _adjustPassThrough()).catchError((error) {
-      if (error is! AssetNotFoundException || error.id != input.id) {
-        throw error;
-      }
+      return _removeStaleTransforms().then((_) {
+        if (_hasBecomeDirty || _isRemoved) return null;
+        return _addFreshTransforms(oldTransformers);
+      });
+    }).catchError((error, stackTrace) {
+      if (error is! AssetNotFoundException || error.id != input.id) throw error;
 
-      // If the asset is removed, [_tryUntilStable] will throw an
+      // If the asset is removed, [input.whenAvailable] will throw an
       // [AssetNotFoundException]. In that case, just remove it.
       remove();
-    }).whenComplete(() {
-      _adjustTransformersFuture = null;
+    }).then((_) {
+      if (_isRemoved) return;
+
+      _isAdjustingTransformers = false;
+      if (_hasBecomeDirty) {
+        _adjustTransformers();
+      } else if (!isDirty) {
+        _adjustPassThrough();
+        _onDoneController.add(null);
+      }
     });
   }
 
-  // Remove any old transforms that used to have [asset] as a primary asset but
-  // no longer apply to its new contents.
-  Future _removeStaleTransforms(Asset asset, Set<Transformer> transformers) {
+  // Remove any old transforms that used to have [input]'s asset as a primary
+  // asset but no longer apply to its new contents.
+  Future _removeStaleTransforms() {
+    assert(input.state.isAvailable);
+
     return Future.wait(_transforms.map((transform) {
-      return newFuture(() {
-        if (!transformers.contains(transform.transformer)) return false;
+      return syncFuture(() {
+        if (!_transformers.contains(transform.transformer)) return false;
 
         // TODO(rnystrom): Catch all errors from isPrimary() and redirect to
         // results (issue 16162).
-        return transform.transformer.isPrimary(asset);
+        return transform.transformer.isPrimary(input.asset);
       }).then((isPrimary) {
-        if (isPrimary) return;
-        _transforms.remove(transform);
-        transform.remove();
+        if (_hasBecomeDirty) return;
+        if (isPrimary) {
+          transform.markPrimary();
+        } else if (_transforms.remove(transform)) {
+          transform.remove();
+        }
       });
     }));
   }
@@ -220,107 +228,75 @@
   // transforms that had [input] as a primary input prior to this. They don't
   // need to be checked, since their transforms were removed or preserved in
   // [_removeStaleTransforms].
-  Future _addFreshTransforms(Set<Transformer> transformers,
-      Set<Transformer> oldTransformers) {
-    return Future.wait(transformers.map((transformer) {
+  Future _addFreshTransforms(Set<Transformer> oldTransformers) {
+    assert(input.state.isAvailable);
+
+    return Future.wait(_transformers.map((transformer) {
       if (oldTransformers.contains(transformer)) return new Future.value();
 
-      // If the asset is unavailable, the results of this [_adjustTransformers]
-      // run will be discarded, so we can just short-circuit.
-      if (input.asset == null) return new Future.value();
-
-      // We can safely access [input.asset] here even though it might have
-      // changed since (as above) if it has, [_adjustTransformers] will just be
-      // re-run.
       // TODO(rnystrom): Catch all errors from isPrimary() and redirect to
       // results.
       return transformer.isPrimary(input.asset).then((isPrimary) {
-        if (!isPrimary) return;
+        if (_hasBecomeDirty || !isPrimary) return;
         var transform = new TransformNode(
             _phase, transformer, input, _location);
         _transforms.add(transform);
-        _onDirtyPool.add(transform.onDirty);
+
+        transform.onStateChange.listen((_) {
+          if (isDirty) {
+            if (_passThroughController == null) return;
+            _passThroughController.setDirty();
+          } else {
+            _adjustPassThrough();
+            _onDoneController.add(null);
+          }
+        });
+
+        transform.onAsset.listen((asset) {
+          if (asset.id == input.id) {
+            _overwritingOutputs.add(asset);
+            asset.whenRemoved(_adjustPassThrough);
+            _adjustPassThrough();
+          }
+
+          _onAssetController.add(asset);
+        }, onDone: () => _transforms.remove(transform));
+
         _onLogPool.add(transform.onLog);
       });
     }));
   }
 
   /// Adjust whether [input] is passed through the phase unmodified, based on
-  /// whether it's consumed by other transforms in this phase.
+  /// whether it's overwritten by other transforms in this phase.
   ///
   /// If [input] was already passed-through, this will update the passed-through
   /// value.
   void _adjustPassThrough() {
-    assert(input.state.isAvailable);
+    // If [input] is removed, [_adjustPassThrough] can still be called due to
+    // [TransformNode]s marking their outputs as removed.
+    if (!input.state.isAvailable) return;
 
-    if (_transforms.isEmpty) {
+    // If there's an output with the same id as the primary input, that
+    // overwrites the input so it doesn't get passed through. Otherwise,
+    // create a pass-through controller if none exists, or set the existing
+    // one available.
+    if (_overwritingOutputs.isNotEmpty) {
       if (_passThroughController != null) {
-        _passThroughController.setAvailable(input.asset);
-      } else {
-        _passThroughController = new AssetNodeController.from(input);
-        _newPassThrough = true;
+        _passThroughController.setRemoved();
+        _passThroughController = null;
       }
-    } else if (_passThroughController != null) {
-      _passThroughController.setRemoved();
-      _passThroughController = null;
-      _newPassThrough = false;
+    } else if (isDirty) {
+      // If the input is dirty, we're still figuring out whether a transform
+      // will overwrite the input. As such, we shouldn't pass through the asset
+      // yet.
+    } else if (_passThroughController == null) {
+      _passThroughController = new AssetNodeController.from(input);
+      _onAssetController.add(_passThroughController.node);
+    } else if (_passThroughController.node.state.isDirty) {
+      _passThroughController.setAvailable(input.asset);
     }
   }
 
-  /// Like [AssetNode.tryUntilStable], but also re-runs [callback] if this
-  /// phase's transformers are modified.
-  Future _tryUntilStable(
-      Future callback(Asset asset, Set<Transformer> transformers)) {
-    var oldTransformers;
-    return input.tryUntilStable((asset) {
-      oldTransformers = _transformers.toSet();
-      return callback(asset, _transformers);
-    }).then((result) {
-      if (setEquals(oldTransformers, _transformers)) return result;
-      return _tryUntilStable(callback);
-    });
-  }
-
-  /// Processes the transforms for this input.
-  ///
-  /// Returns the set of newly-created asset nodes that transforms have emitted
-  /// for this input. The assets returned this way are guaranteed not to be
-  /// [AssetState.REMOVED].
-  Future<Set<AssetNode>> process() {
-    return _waitForTransformers(() => _processTransforms()).then((outputs) {
-      if (input.state.isRemoved) return new Set();
-      return outputs;
-    });
-  }
-
-  /// Runs [callback] once all the transformers are adjusted correctly and the
-  /// input is ready to be processed.
-  ///
-  /// If the transformers are already properly adjusted, [callback] is called
-  /// synchronously to ensure that [_adjustTransformers] isn't called before the
-  /// callback.
-  Future _waitForTransformers(callback()) {
-    if (_adjustTransformersFuture == null) return syncFuture(callback);
-    return _adjustTransformersFuture.then(
-        (_) => _waitForTransformers(callback));
-  }
-
-  /// Applies all currently wired up and dirty transforms.
-  Future<Set<AssetNode>> _processTransforms() {
-    if (input.state.isRemoved) return new Future.value(new Set());
-
-    if (_passThroughController != null) {
-      if (!_newPassThrough) return new Future.value(new Set());
-      _newPassThrough = false;
-      return new Future.value(
-          new Set<AssetNode>.from([_passThroughController.node]));
-    }
-
-    return Future.wait(_transforms.map((transform) {
-      if (!transform.isDirty) return new Future.value(new Set());
-      return transform.apply();
-    })).then((outputs) => unionAll(outputs));
-  }
-
   String toString() => "phase input in $_location for $input";
 }
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/phase_output.dart
index 50d39c3..1807156 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/phase_output.dart
@@ -7,12 +7,10 @@
 import 'dart:async';
 import 'dart:collection';
 
-import 'asset_cascade.dart';
 import 'asset_forwarder.dart';
 import 'asset_node.dart';
 import 'errors.dart';
 import 'phase.dart';
-import 'utils.dart';
 
 /// A class that handles a single output of a phase.
 ///
@@ -38,7 +36,7 @@
   /// 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>();
+  final _onAssetController = new StreamController<AssetNode>(sync: true);
 
   /// The assets for this output.
   ///
@@ -105,10 +103,8 @@
       // If there's still a collision, report it. This lets the user know if
       // they've successfully resolved the collision or not.
       if (_assets.length > 1) {
-        // Pump the event queue to ensure that the removal of the input triggers
-        // a new build to which we can attach the error.
         // TODO(nweiz): report this through the output asset.
-        newFuture(() => _phase.cascade.reportError(collisionException));
+        _phase.cascade.reportError(collisionException);
       }
     });
   }
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index bba950a..8aeb657 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -42,10 +42,19 @@
   /// The subscription to [primary]'s [AssetNode.onStateChange] stream.
   StreamSubscription _primarySubscription;
 
-  /// True if an input has been modified since the last time this transform
-  /// began running.
-  bool get isDirty => _isDirty;
-  var _isDirty = true;
+  // TODO(nweiz): Remove this and move isPrimary computation into TransformNode.
+  /// Whether the parent [PhaseInput] is currently computing whether its input
+  /// is primary for [this].
+  bool _pendingIsPrimary = false;
+
+  /// Whether [this] is dirty and still has more processing to do.
+  bool get isDirty => _pendingIsPrimary || _isApplying;
+
+  /// Whether any input has become dirty since [_apply] last started running.
+  var _hasBecomeDirty = false;
+
+  /// Whether [_apply] is currently running.
+  var _isApplying = false;
 
   /// Whether [transformer] is lazy and this transform has yet to be forced.
   bool _isLazy;
@@ -56,14 +65,23 @@
   /// The controllers for the asset nodes emitted by this node.
   var _outputControllers = new Map<AssetId, AssetNodeController>();
 
-  /// A stream that emits an event whenever this transform becomes dirty and
-  /// needs to be re-run.
+  // TODO(nweiz): It's weird that this is different than the [onDone] stream the
+  // other nodes emit. See if we can make that more consistent.
+  /// A stream that emits an event whenever [onDirty] changes its value.
   ///
-  /// This may emit events when the transform was already dirty or while
-  /// processing transforms. Events are emitted synchronously to ensure that the
-  /// dirty state is thoroughly propagated as soon as any assets are changed.
-  Stream get onDirty => _onDirtyController.stream;
-  final _onDirtyController = new StreamController.broadcast(sync: true);
+  /// This is synchronous in order to guarantee that it will emit an event as
+  /// soon as [isDirty] changes. It's possible for this to emit multiple events
+  /// while [isDirty] is `true`. However, it will only emit a single event each
+  /// time [isDirty] becomes `false`.
+  Stream get onStateChange => _onStateChangeController.stream;
+  final _onStateChangeController = new StreamController.broadcast(sync: true);
+
+  /// 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 => _onAssetController.stream;
+  final _onAssetController = new StreamController<AssetNode>(sync: true);
 
   /// A stream that emits an event whenever this transform logs an entry.
   ///
@@ -81,9 +99,12 @@
       if (state.isRemoved) {
         remove();
       } else {
+        if (state.isDirty) _pendingIsPrimary = true;
         _dirty();
       }
     });
+
+    _apply();
   }
 
   /// The [TransformInfo] describing this node.
@@ -99,8 +120,9 @@
   /// from the primary input, but it's possible for a transform to no longer be
   /// valid even if its primary input still exists.
   void remove() {
-    _isDirty = true;
-    _onDirtyController.close();
+    _hasBecomeDirty = false;
+    _onAssetController.close();
+    _onStateChangeController.close();
     _primarySubscription.cancel();
     for (var subscription in _inputSubscriptions.values) {
       subscription.cancel();
@@ -120,23 +142,31 @@
     _dirty();
   }
 
+  // TODO(nweiz): remove this and move isPrimary computation into TransformNode.
+  /// Mark that the parent [PhaseInput] has determined that its input is indeed
+  /// primary for [this].
+  void markPrimary() {
+    if (!_pendingIsPrimary) return;
+    _pendingIsPrimary = false;
+    if (!_isApplying) _apply();
+  }
+
   /// Marks this transform as dirty.
   ///
   /// This causes all of the transform's outputs to be marked as dirty as well.
   void _dirty() {
-    _isDirty = true;
     for (var controller in _outputControllers.values) {
       controller.setDirty();
     }
-    _onDirtyController.add(null);
+
+    _hasBecomeDirty = true;
+    _onStateChangeController.add(null);
+    if (!_isApplying && !_pendingIsPrimary) _apply();
   }
 
   /// Applies this transform.
-  ///
-  /// Returns a set of asset nodes representing the outputs from this transform
-  /// that weren't emitted last time it was run.
-  Future<Set<AssetNode>> apply() {
-    assert(!_onDirtyController.isClosed);
+  void _apply() {
+    assert(!_onAssetController.isClosed);
 
     // Clear all the old input subscriptions. If an input is re-used, we'll
     // re-subscribe.
@@ -145,9 +175,11 @@
     }
     _inputSubscriptions.clear();
 
-    _isDirty = false;
+    _isApplying = true;
+    _onStateChangeController.add(null);
+    primary.whenAvailable((_) {
+      _hasBecomeDirty = false;
 
-    return syncFuture(() {
       // TODO(nweiz): If [transformer] is a [DeclaringTransformer] but not a
       // [LazyTransformer], we can get some mileage out of doing a declarative
       // first so we know how to hook up the assets.
@@ -156,7 +188,7 @@
     }).catchError((error, stackTrace) {
       // If the transform became dirty while processing, ignore any errors from
       // it.
-      if (_isDirty) return new Set();
+      if (_hasBecomeDirty || _onAssetController.isClosed) return;
 
       if (error is! MissingInputException) {
         error = new TransformerException(info, error, stackTrace);
@@ -166,7 +198,23 @@
       // is so a broken transformer doesn't take down the whole graph.
       phase.cascade.reportError(error);
 
-      return new Set();
+      // Remove all the previously-emitted assets.
+      for (var controller in _outputControllers.values) {
+        controller.setRemoved();
+      }
+      _outputControllers.clear();
+    }).then((_) {
+      if (_onAssetController.isClosed) return;
+
+      _isApplying = false;
+      if (_hasBecomeDirty) {
+        // Re-apply the transform if it became dirty while applying.
+        if (!_pendingIsPrimary) _apply();
+      } else {
+        assert(!isDirty);
+        // Otherwise, notify the parent nodes that it's no longer dirty.
+        _onStateChangeController.add(null);
+      }
     });
   }
 
@@ -181,30 +229,21 @@
       // results stream.
       if (node == null) throw new MissingInputException(info, id);
 
-      // If the asset node is found, wait until its contents are actually
-      // available before we return them.
-      return node.whenAvailable((asset) {
-        _inputSubscriptions.putIfAbsent(node.id,
-            () => node.onStateChange.listen((_) => _dirty()));
+      _inputSubscriptions.putIfAbsent(node.id,
+          () => node.onStateChange.listen((_) => _dirty()));
 
-        return asset;
-      }).catchError((error) {
-        if (error is! AssetNotFoundException || error.id != id) throw error;
-        // If the node was removed before it could be loaded, treat it as though
-        // it never existed and throw a MissingInputException.
-        throw new MissingInputException(info, id);
-      });
+      return node.asset;
     });
   }
 
   /// Applies the transform so that it produces concrete (as opposed to lazy)
   /// outputs.
-  Future<Set<AssetNode>> _applyImmediate() {
+  Future _applyImmediate() {
     var newOutputs = new AssetSet();
     var transform = new Transform(this, newOutputs, _log);
 
     return syncFuture(() => transformer.apply(transform)).then((_) {
-      if (_isDirty) return new Set();
+      if (_hasBecomeDirty || _onAssetController.isClosed) return;
 
       // Any ids that are for a different package are invalid.
       var invalidIds = newOutputs
@@ -223,7 +262,6 @@
         _outputControllers.remove(id).setRemoved();
       }
 
-      var brandNewOutputs = new Set<AssetNode>();
       // Store any new outputs or new contents for existing outputs.
       for (var asset in newOutputs) {
         var controller = _outputControllers[asset.id];
@@ -232,24 +270,22 @@
         } else {
           var controller = new AssetNodeController.available(asset, this);
           _outputControllers[asset.id] = controller;
-          brandNewOutputs.add(controller.node);
+          _onAssetController.add(controller.node);
         }
       }
-
-      return brandNewOutputs;
     });
   }
 
   /// Applies the transform in declarative mode so that it produces lazy
   /// outputs.
-  Future<Set<AssetNode>> _declareLazy() {
+  Future _declareLazy() {
     var newIds = new Set();
     var transform = new DeclaringTransform(this, newIds, _log);
 
     return syncFuture(() {
       return (transformer as LazyTransformer).declareOutputs(transform);
     }).then((_) {
-      if (_isDirty) return new Set();
+      if (_hasBecomeDirty || _onAssetController.isClosed) return;
 
       var invalidIds =
           newIds.where((id) => id.package != phase.cascade.package).toSet();
@@ -265,7 +301,6 @@
         _outputControllers.remove(id).setRemoved();
       }
 
-      var brandNewOutputs = new Set<AssetNode>();
       for (var id in newIds) {
         var controller = _outputControllers[id];
         if (controller != null) {
@@ -273,11 +308,9 @@
         } else {
           var controller = new AssetNodeController.lazy(id, force, this);
           _outputControllers[id] = controller;
-          brandNewOutputs.add(controller.node);
+          _onAssetController.add(controller.node);
         }
       }
-
-      return brandNewOutputs;
     });
   }
 
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 1df6af0..42c5443 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -26,6 +26,7 @@
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
   stack_trace: ">=0.9.1 <0.10.0"
+  collection: ">=0.9.1 <0.10.0"
 dev_dependencies:
   scheduled_test: ">=0.9.0 <0.11.0"
   unittest: ">=0.9.0 <0.10.0"
diff --git a/pkg/barback/test/package_graph/add_remove_transform_test.dart b/pkg/barback/test/package_graph/add_remove_transform_test.dart
index ac0076c..845ee97 100644
--- a/pkg/barback/test/package_graph/add_remove_transform_test.dart
+++ b/pkg/barback/test/package_graph/add_remove_transform_test.dart
@@ -20,7 +20,6 @@
 
     updateTransformers("app", [[new RewriteTransformer("blub", "blab")]]);
     expectAsset("app|foo.blab", "foo.blab");
-    expectNoAsset("app|foo.blub");
     buildShouldSucceed();
   });
 
@@ -43,12 +42,10 @@
 
     updateSources(["app|foo.blub"]);
     expectAsset("app|foo.blab", "foo.blab");
-    expectNoAsset("app|foo.blub");
     buildShouldSucceed();
 
     updateTransformers("app", [[rewrite]]);
     expectAsset("app|foo.blab", "foo.blab");
-    expectNoAsset("app|foo.blub");
     buildShouldSucceed();
 
     expect(rewrite.numRuns, completion(equals(1)));
@@ -61,7 +58,6 @@
 
     updateSources(["app|foo.txt"]);
     expectAsset("app|foo.blab", "foo.blub.blab");
-    expectNoAsset("app|foo.blub");
     buildShouldSucceed();
 
     updateTransformers("app", [[rewrite2], [rewrite1]]);
@@ -94,7 +90,6 @@
 
     updateSources(["app|foo.blub"]);
     expectAsset("app|foo.blab", "foo.blab");
-    expectNoAsset("app|foo.blub");
     buildShouldSucceed();
 
     updateTransformers("app", []);
@@ -192,22 +187,6 @@
     buildShouldSucceed();
   });
 
-  test("a new transformer can see pass-through assets", () {
-    var rewrite = new RewriteTransformer("zip", "zap");
-    initGraph(["app|foo.blub"], {"app": [[rewrite]]});
-
-    updateSources(["app|foo.blub"]);
-    buildShouldSucceed();
-
-    updateTransformers("app", [
-      [rewrite],
-      [new RewriteTransformer("blub", "blab")]
-    ]);
-    expectAsset("app|foo.blab", "foo.blab");
-    expectNoAsset("app|foo.blub");
-    buildShouldSucceed();
-  });
-
   test("a cross-package transform sees a new transformer in a new phase", () {
     var rewrite = new RewriteTransformer("inc", "inc");
     initGraph({
@@ -253,6 +232,108 @@
     buildShouldSucceed();
   });
 
+  group("pass-through", () {
+    test("a new transformer can see pass-through assets", () {
+      var rewrite = new RewriteTransformer("zip", "zap");
+      initGraph(["app|foo.blub"], {"app": [[rewrite]]});
+
+      updateSources(["app|foo.blub"]);
+      buildShouldSucceed();
+
+      updateTransformers("app", [
+        [rewrite],
+        [new RewriteTransformer("blub", "blab")]
+      ]);
+      expectAsset("app|foo.blab", "foo.blab");
+      buildShouldSucceed();
+    });
+
+    test("a new transformer can overwrite an old asset", () {
+      var rewrite = new RewriteTransformer("zip", "zap");
+      initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+
+      // Add a transformer that will overwrite the previously-passed-through
+      // "foo.txt" asset. The transformed asset should be emitted, not the
+      // passed-through asset.
+      updateTransformers("app", [
+        [rewrite, new RewriteTransformer("txt", "txt")]
+      ]);
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+    });
+
+    test("passes an asset through when an overwriting transform is removed",
+        () {
+      initGraph(["app|foo.txt"], {
+        "app": [[new RewriteTransformer("txt", "txt")]]
+      });
+
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+
+      updateTransformers("app", [[]]);
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+    });
+
+    test("passes an asset through when its overwriting transform is removed "
+        "during apply", () {
+      var rewrite = new RewriteTransformer("txt", "txt");
+      initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|foo.txt");
+
+      updateTransformers("app", [[]]);
+      rewrite.resumeApply();
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through when its overwriting transform is "
+        "removed during apply if another transform overwrites it", () {
+      var rewrite1 = new RewriteTransformer("txt", "txt");
+      var rewrite2 = new RewriteTransformer("txt", "txt");
+      initGraph(["app|foo.txt"], {"app": [[rewrite1, rewrite2]]});
+
+      rewrite1.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo.txt");
+      // Ensure we're waiting on [rewrite1.apply]
+      schedule(pumpEventQueue);
+
+      updateTransformers("app", [[rewrite2]]);
+      rewrite1.resumeApply();
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through when one overwriting transform is "
+        "removed if another transform still overwrites it", () {
+      var rewrite = new RewriteTransformer("txt", "txt");
+      initGraph(["app|foo.txt"], {"app": [[
+        rewrite,
+        new RewriteTransformer("txt", "txt")
+      ]]});
+
+      updateSources(["app|foo.txt"]);
+      // This could be either the output of [CheckContentTransformer] or
+      // [RewriteTransformer], depending which completes first.
+      expectAsset("app|foo.txt", anything);
+      buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+
+      updateTransformers("app", [[rewrite]]);
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+    });
+  });
+
   // Regression test.
   test("a phase is added, then an input is removed and re-added", () {
     var rewrite = new RewriteTransformer("txt", "mid");
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 8c74991..9b67409 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -114,15 +114,6 @@
     buildShouldFail([isTransformerException(equals(BadTransformer.ERROR))]);
   });
 
-  test("doesn't yield a source if a transform fails on it", () {
-    initGraph(["app|foo.txt"], {"app": [
-      [new BadTransformer(["app|foo.txt"])]
-    ]});
-
-    updateSources(["app|foo.txt"]);
-    expectNoAsset("app|foo.txt");
-  });
-
   test("catches errors even if nothing is waiting for process results", () {
     initGraph(["app|foo.txt"], {"app": [[new BadTransformer([])]]});
 
@@ -268,7 +259,10 @@
     rewrite2.resumeApply();
     schedule(pumpEventQueue);
     rewrite3.resumeApply();
-    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+    buildShouldFail([
+      isAssetCollisionException("app|foo.out"),
+      isAssetCollisionException("app|foo.out")
+    ]);
 
     // Then update rewrite3 in a separate build. rewrite2 should still be the
     // next version of foo.out in line.
diff --git a/pkg/barback/test/package_graph/get_all_assets_test.dart b/pkg/barback/test/package_graph/get_all_assets_test.dart
index 0ece84b..7cadbdf 100644
--- a/pkg/barback/test/package_graph/get_all_assets_test.dart
+++ b/pkg/barback/test/package_graph/get_all_assets_test.dart
@@ -18,24 +18,24 @@
     buildShouldSucceed();
   });
 
-  test("includes transformed outputs, but not consumed ones", () {
+  test("includes transformed outputs", () {
     initGraph(["app|a.txt", "app|foo.blub"], {"app": [
       [new RewriteTransformer("blub", "blab")]
     ]});
     updateSources(["app|a.txt", "app|foo.blub"]);
-    expectAllAssets(["app|a.txt", "app|foo.blab"]);
+    expectAllAssets(["app|a.txt", "app|foo.blub", "app|foo.blab"]);
     buildShouldSucceed();
   });
 
-  test("includes non-primary inputs to transformers", () {
-    var transformer = new ManyToOneTransformer("txt");
-    initGraph({
-      "app|a.txt": "a.inc",
-      "app|a.inc": "a"
-    }, {"app": [[transformer]]});
-
-    updateSources(["app|a.txt", "app|a.inc"]);
-    expectAllAssets(["app|a.inc", "app|a.out"]);
+  test("includes overwritten outputs", () {
+    initGraph(["app|a.txt", "app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|a.txt", "app|foo.blub"]);
+    expectAllAssets({
+      "app|a.txt": "a",
+      "app|foo.blub": "foo.blub"
+    });
     buildShouldSucceed();
   });
 
diff --git a/pkg/barback/test/package_graph/group_test.dart b/pkg/barback/test/package_graph/group_test.dart
index bc77c37..2588ebf 100644
--- a/pkg/barback/test/package_graph/group_test.dart
+++ b/pkg/barback/test/package_graph/group_test.dart
@@ -21,7 +21,6 @@
       ])]
     ]});
     updateSources(["app|foo.a"]);
-    expectNoAsset("app|foo.b");
     expectAsset("app|foo.c", "foo.b.c");
     buildShouldSucceed();
   });
@@ -35,7 +34,6 @@
       [new RewriteTransformer("c", "d")]
     ]});
     updateSources(["app|foo.a"]);
-    expectNoAsset("app|foo.c");
     expectAsset("app|foo.d", "foo.b.c.d");
     buildShouldSucceed();
   });
@@ -49,7 +47,6 @@
       ])]
     ]});
     updateSources(["app|foo.a"]);
-    expectNoAsset("app|foo.b");
     expectAsset("app|foo.d", "foo.b.c.d");
     buildShouldSucceed();
   });
@@ -100,7 +97,6 @@
     ]});
 
     updateSources(["app|foo.a"]);
-    expectNoAsset("app|foo.b");
     expectAsset("app|foo.c", "foo.b.c");
     buildShouldSucceed();
 
@@ -121,7 +117,6 @@
     ]});
 
     updateSources(["app|foo.a", "app|bar.x"]);
-    expectNoAsset("app|foo.b");
     expectAsset("app|foo.c", "foo.b.c");
     expectAsset("app|bar.c", "bar.b.c");
     buildShouldSucceed();
@@ -196,21 +191,23 @@
       buildShouldSucceed();
     });
 
-    test("parallel groups' intermediate assets can't collide", () {
-      initGraph(["app|foo.a", "app|foo.x"], {"app": [
-        [new TransformerGroup([
-          [new RewriteTransformer("a", "b")],
-          [new RewriteTransformer("b", "c")]
-        ]), new TransformerGroup([
-          [new RewriteTransformer("x", "b")],
-          [new RewriteTransformer("b", "z")]
-        ])]
-      ]});
-      updateSources(["app|foo.a", "app|foo.x"]);
-      expectAsset("app|foo.c", "foo.b.c");
-      expectAsset("app|foo.z", "foo.b.z");
-      buildShouldSucceed();
-    });
+    // TODO(nweiz): re-enable this test when a transformer can consume its
+    // primary input (issue 16612).
+    // test("parallel groups' intermediate assets can't collide", () {
+    //   initGraph(["app|foo.a", "app|foo.x"], {"app": [
+    //     [new TransformerGroup([
+    //       [new RewriteTransformer("a", "b")],
+    //       [new RewriteTransformer("b", "c")]
+    //     ]), new TransformerGroup([
+    //       [new RewriteTransformer("x", "b")],
+    //       [new RewriteTransformer("b", "z")]
+    //     ])]
+    //   ]});
+    //   updateSources(["app|foo.a", "app|foo.x"]);
+    //   expectAsset("app|foo.c", "foo.b.c");
+    //   expectAsset("app|foo.z", "foo.b.z");
+    //   buildShouldSucceed();
+    // });
   });
 
   group("pass-through", () {
@@ -227,6 +224,20 @@
       buildShouldSucceed();
     });
 
+    test("passes non-overwritten inputs through a group", () {
+      initGraph(["app|foo.a"], {"app": [
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ])]
+      ]});
+      updateSources(["app|foo.a"]);
+      expectAsset("app|foo.a", "foo");
+      expectAsset("app|foo.b", "foo.b");
+      expectAsset("app|foo.c", "foo.b.c");
+      buildShouldSucceed();
+    });
+
     test("passes an unused input through parallel groups", () {
       initGraph(["app|foo.x"], {"app": [
         [new TransformerGroup([
@@ -259,35 +270,32 @@
       buildShouldSucceed();
     });
 
-    test("doesn't pass through an input that's used by a group but not by "
-        "transformers", () {
+    test("doesn't pass through an input that's overwritten by a group but not "
+        "by transformers", () {
       initGraph(["app|foo.a"], {"app": [[
         new TransformerGroup([
-          [new RewriteTransformer("a", "b")],
-          [new RewriteTransformer("b", "c")]
+          [new RewriteTransformer("a", "a")],
         ]),
         new RewriteTransformer("x", "y")
       ]]});
       updateSources(["app|foo.a"]);
-      expectNoAsset("app|foo.a");
       expectNoAsset("app|foo.y");
-      expectAsset("app|foo.c", "foo.b.c");
+      expectAsset("app|foo.a", "foo.a");
       buildShouldSucceed();
     });
 
-    test("doesn't pass through an input that's used by transformers but not by "
-        "a group", () {
+    test("doesn't pass through an input that's overwritten by transformers but "
+        "not by a group", () {
       initGraph(["app|foo.x"], {"app": [[
         new TransformerGroup([
           [new RewriteTransformer("a", "b")],
           [new RewriteTransformer("b", "c")]
         ]),
-        new RewriteTransformer("x", "y")
+        new RewriteTransformer("x", "x")
       ]]});
       updateSources(["app|foo.x"]);
-      expectNoAsset("app|foo.x");
       expectNoAsset("app|foo.c");
-      expectAsset("app|foo.y", "foo.y");
+      expectAsset("app|foo.x", "foo.x");
       buildShouldSucceed();
     });
 
@@ -315,31 +323,6 @@
       expectAsset("app|foo.a", "foo.a");
       buildShouldSucceed();
     });
-
-    test("doesn't pass-through an asset that ceases to be forwarded due to a "
-        "resolved collision", () {
-      initGraph({
-        "app|foo.a": "foo.a",
-        "app|foo.x": "foo.x"
-      }, {"app": [
-        [new TransformerGroup([[
-          new CheckContentAndRenameTransformer(
-              "a", "new foo.a", "z", "modified foo.a"),
-          new RewriteTransformer('x', 'a')
-        ]])]
-      ]});
-
-      updateSources(["app|foo.a", "app|foo.x"]);
-      expectAsset("app|foo.a", "foo.a");
-      expectNoAsset("app|foo.z");
-      buildShouldFail([isAssetCollisionException("app|foo.a")]);
-
-      modifyAsset('app|foo.a', 'new foo.a');
-      updateSources(["app|foo.a"]);
-      expectAsset("app|foo.a", "foo.x.a");
-      expectAsset("app|foo.z", "modified foo.a");
-      buildShouldSucceed();
-    });
   });
 
   test("runs transforms in an added group", () {
@@ -383,7 +366,23 @@
     expect(rewrite2.numRuns, completion(equals(1)));
   });
 
-  test("doesn't pass through an input that's used by an added group", () {
+  test("doesn't run transforms in a removed group", () {
+    var rewrite1 = new RewriteTransformer("a", "b");
+    var rewrite2 = new RewriteTransformer("b", "c");
+    var group = new TransformerGroup([[rewrite1], [rewrite2]]);
+    initGraph(["app|foo.a"], {"app": [[group]]});
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.b.c");
+    buildShouldSucceed();
+
+    updateTransformers("app", []);
+    expectNoAsset("app|foo.c");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass through an input that's overwritten by an added group",
+      () {
     var rewrite = new RewriteTransformer("x", "z");
     initGraph(["app|foo.a"], {"app": [[rewrite]]});
 
@@ -392,13 +391,9 @@
     buildShouldSucceed();
 
     updateTransformers("app", [
-      [rewrite, new TransformerGroup([
-        [new RewriteTransformer("a", "b")],
-        [new RewriteTransformer("b", "c")]
-      ])]
+      [rewrite, new TransformerGroup([[new RewriteTransformer("a", "a")]])]
     ]);
-    expectNoAsset("app|foo.a");
-    expectAsset("app|foo.c", "foo.b.c");
+    expectAsset("app|foo.a", "foo.a");
     buildShouldSucceed();
   });
 
diff --git a/pkg/barback/test/package_graph/lazy_transformer_test.dart b/pkg/barback/test/package_graph/lazy_transformer_test.dart
index c43c9f1..1c96e02 100644
--- a/pkg/barback/test/package_graph/lazy_transformer_test.dart
+++ b/pkg/barback/test/package_graph/lazy_transformer_test.dart
@@ -25,7 +25,7 @@
     var transformer = new LazyRewriteTransformer("blub", "blab");
     initGraph(["app|foo.blub"], {"app": [[transformer]]});
     updateSources(["app|foo.blub"]);
-    expectAllAssets(["app|foo.blab"]);
+    expectAllAssets(["app|foo.blub", "app|foo.blab"]);
     buildShouldSucceed();
     expect(transformer.numRuns, completion(equals(1)));
   });
diff --git a/pkg/barback/test/package_graph/transform/concurrency_test.dart b/pkg/barback/test/package_graph/transform/concurrency_test.dart
new file mode 100644
index 0000000..41e3047
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/concurrency_test.dart
@@ -0,0 +1,493 @@
+// 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 library contains tests for transformer behavior that relates to actions
+/// happening concurrently or other complex asynchronous timing behavior.
+library barback.test.package_graph.transform.concurrency_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("runs transforms in the same phase in parallel", () {
+    var transformerA = new RewriteTransformer("txt", "a");
+    var transformerB = new RewriteTransformer("txt", "b");
+    initGraph(["app|foo.txt"], {"app": [[transformerA, transformerB]]});
+
+    transformerA.pauseApply();
+    transformerB.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+
+    transformerA.waitUntilStarted();
+    transformerB.waitUntilStarted();
+
+    // They should both still be running.
+    expect(transformerA.isRunning, completion(isTrue));
+    expect(transformerB.isRunning, completion(isTrue));
+
+    transformerA.resumeApply();
+    transformerB.resumeApply();
+
+    expectAsset("app|foo.a", "foo.a");
+    expectAsset("app|foo.b", "foo.b");
+    buildShouldSucceed();
+  });
+
+  test("discards outputs from a transform whose primary input is removed "
+      "during processing", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.txt"]);
+    rewrite.waitUntilStarted();
+
+    removeSources(["app|foo.txt"]);
+    rewrite.resumeApply();
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("applies the correct transform if an asset is modified during isPrimary",
+      () {
+    var check1 = new CheckContentTransformer("first", "#1");
+    var check2 = new CheckContentTransformer("second", "#2");
+    initGraph({
+      "app|foo.txt": "first",
+    }, {"app": [[check1, check2]]});
+
+    check1.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Ensure that we're waiting on check1's isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "second");
+    updateSources(["app|foo.txt"]);
+    check1.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "second#2");
+    buildShouldSucceed();
+  });
+
+  test("applies the correct transform if an asset is removed and added during "
+      "isPrimary", () {
+    var check1 = new CheckContentTransformer("first", "#1");
+    var check2 = new CheckContentTransformer("second", "#2");
+    initGraph({
+      "app|foo.txt": "first",
+    }, {"app": [[check1, check2]]});
+
+    check1.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Ensure that we're waiting on check1's isPrimary.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    modifyAsset("app|foo.txt", "second");
+    updateSources(["app|foo.txt"]);
+    check1.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "second#2");
+    buildShouldSucceed();
+  });
+
+  test("restarts processing if a change occurs during processing", () {
+    var transformer = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+    transformer.waitUntilStarted();
+
+    // Now update the graph during it.
+    updateSources(["app|foo.txt"]);
+    transformer.resumeApply();
+
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("aborts processing if the primary input is removed during processing",
+      () {
+    var transformer = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+    transformer.waitUntilStarted();
+
+    // Now remove its primary input while it's running.
+    removeSources(["app|foo.txt"]);
+    transformer.resumeApply();
+
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("restarts processing if a change to a new secondary input occurs during "
+      "processing", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar"
+    }, {"app": [[transformer]]});
+
+    transformer.pauseApply();
+
+    updateSources(["app|foo.txt", "app|bar.inc"]);
+    transformer.waitUntilStarted();
+
+    // Give the transform time to load bar.inc the first time.
+    schedule(pumpEventQueue);
+
+    // Now update the secondary input before the transform finishes.
+    modifyAsset("app|bar.inc", "baz");
+    updateSources(["app|bar.inc"]);
+    // Give bar.inc enough time to be loaded and marked available before the
+    // transformer completes.
+    schedule(pumpEventQueue);
+
+    transformer.resumeApply();
+
+    expectAsset("app|foo.out", "baz");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("doesn't restart processing if a change to an old secondary input "
+      "occurs during processing", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar",
+      "app|baz.inc": "baz"
+    }, {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt", "app|bar.inc", "app|baz.inc"]);
+    expectAsset("app|foo.out", "bar");
+    buildShouldSucceed();
+
+    transformer.pauseApply();
+    modifyAsset("app|foo.txt", "baz.inc");
+    updateSources(["app|foo.txt"]);
+    transformer.waitUntilStarted();
+
+    // Now update the old secondary input before the transform finishes.
+    modifyAsset("app|bar.inc", "new bar");
+    updateSources(["app|bar.inc"]);
+    // Give bar.inc enough time to be loaded and marked available before the
+    // transformer completes.
+    schedule(pumpEventQueue);
+
+    transformer.resumeApply();
+    expectAsset("app|foo.out", "baz");
+    buildShouldSucceed();
+
+    // Should have run once the first time, then again when switching to
+    // baz.inc. Should not run a third time because of bar.inc being modified.
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("restarts before finishing later phases when a change occurs", () {
+    var txtToInt = new RewriteTransformer("txt", "int");
+    var intToOut = new RewriteTransformer("int", "out");
+    initGraph(["app|foo.txt", "app|bar.txt"],
+        {"app": [[txtToInt], [intToOut]]});
+
+    txtToInt.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+    txtToInt.waitUntilStarted();
+
+    // Now update the graph during it.
+    updateSources(["app|bar.txt"]);
+    txtToInt.resumeApply();
+
+    expectAsset("app|foo.out", "foo.int.out");
+    expectAsset("app|bar.out", "bar.int.out");
+    buildShouldSucceed();
+
+    // Should only have run each transform once for each primary.
+    expect(txtToInt.numRuns, completion(equals(2)));
+    expect(intToOut.numRuns, completion(equals(2)));
+  });
+
+  test("doesn't return an asset until it's finished rebuilding", () {
+    initGraph(["app|foo.in"], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new RewriteTransformer("mid", "out")]
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+
+    pauseProvider();
+    modifyAsset("app|foo.in", "new");
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.out");
+    buildShouldNotBeDone();
+
+    resumeProvider();
+    expectAsset("app|foo.out", "new.mid.out");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an asset until its in-place transform is done", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    rewrite.resumeApply();
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an asset that's removed during isPrimary", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    rewrite.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Make sure we're waiting on isPrimary.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    rewrite.resumeIsPrimary("app|foo.txt");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't transform an asset that goes from primary to non-primary "
+      "during isPrimary", () {
+    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
+    initGraph({
+      "app|foo.txt": "do"
+    }, {"app": [[check]]});
+
+    check.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Make sure we're waiting on isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "don't");
+    updateSources(["app|foo.txt"]);
+    check.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "don't");
+    buildShouldSucceed();
+  });
+
+  test("transforms an asset that goes from non-primary to primary "
+      "during isPrimary", () {
+    var check = new CheckContentTransformer("do", "ne");
+    initGraph({
+      "app|foo.txt": "don't"
+    }, {"app": [[check]]});
+
+    check.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Make sure we're waiting on isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "do");
+    updateSources(["app|foo.txt"]);
+    check.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "done");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an asset that's removed during another transformer's "
+      "isPrimary", () {
+    var rewrite1 = new RewriteTransformer("txt", "txt");
+    var rewrite2 = new RewriteTransformer("md", "md");
+    initGraph(["app|foo.txt", "app|foo.md"], {"app": [[rewrite1, rewrite2]]});
+
+    rewrite2.pauseIsPrimary("app|foo.md");
+    updateSources(["app|foo.txt", "app|foo.md"]);
+    // Make sure we're waiting on the correct isPrimary.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    rewrite2.resumeIsPrimary("app|foo.md");
+    expectNoAsset("app|foo.txt");
+    expectAsset("app|foo.md", "foo.md");
+    buildShouldSucceed();
+  });
+
+  test("doesn't transform an asset that goes from primary to non-primary "
+      "during another transformer's isPrimary", () {
+    var rewrite = new RewriteTransformer("md", "md");
+    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
+    initGraph({
+      "app|foo.txt": "do",
+      "app|foo.md": "foo"
+    }, {"app": [[rewrite, check]]});
+
+    rewrite.pauseIsPrimary("app|foo.md");
+    updateSources(["app|foo.txt", "app|foo.md"]);
+    // Make sure we're waiting on the correct isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "don't");
+    updateSources(["app|foo.txt"]);
+    rewrite.resumeIsPrimary("app|foo.md");
+
+    expectAsset("app|foo.txt", "don't");
+    expectAsset("app|foo.md", "foo.md");
+    buildShouldSucceed();
+  });
+
+  test("transforms an asset that goes from non-primary to primary "
+      "during another transformer's isPrimary", () {
+    var rewrite = new RewriteTransformer("md", "md");
+    var check = new CheckContentTransformer("do", "ne");
+    initGraph({
+      "app|foo.txt": "don't",
+      "app|foo.md": "foo"
+    }, {"app": [[rewrite, check]]});
+
+    rewrite.pauseIsPrimary("app|foo.md");
+    updateSources(["app|foo.txt", "app|foo.md"]);
+    // Make sure we're waiting on the correct isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "do");
+    updateSources(["app|foo.txt"]);
+    rewrite.resumeIsPrimary("app|foo.md");
+
+    expectAsset("app|foo.txt", "done");
+    expectAsset("app|foo.md", "foo.md");
+    buildShouldSucceed();
+  });
+
+  test("returns an asset even if an unrelated build is running", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.in",
+    ], {"app": [[new RewriteTransformer("in", "out")]]});
+
+    updateSources(["app|foo.in", "app|bar.in"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectAsset("app|bar.out", "bar.out");
+    buildShouldSucceed();
+
+    pauseProvider();
+    modifyAsset("app|foo.in", "new");
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.out");
+    expectAsset("app|bar.out", "bar.out");
+    buildShouldNotBeDone();
+
+    resumeProvider();
+    expectAsset("app|foo.out", "new.out");
+    buildShouldSucceed();
+  });
+
+  test("doesn't report AssetNotFound until all builds are finished", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [[new RewriteTransformer("in", "out")]]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    pauseProvider();
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.out");
+    expectAssetDoesNotComplete("app|non-existent.out");
+    buildShouldNotBeDone();
+
+    resumeProvider();
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|non-existent.out");
+    buildShouldSucceed();
+  });
+
+  test("doesn't emit a result until all builds are finished", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph([
+      "pkg1|foo.txt",
+      "pkg2|foo.txt"
+    ], {"pkg1": [[rewrite]], "pkg2": [[rewrite]]});
+
+    // First, run both packages' transformers so both packages are successful.
+    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
+    expectAsset("pkg1|foo.out", "foo.out");
+    expectAsset("pkg2|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    // pkg1 is still successful, but pkg2 is waiting on the provider, so the
+    // overall build shouldn't finish.
+    pauseProvider();
+    updateSources(["pkg2|foo.txt"]);
+    expectAsset("pkg1|foo.out", "foo.out");
+    buildShouldNotBeDone();
+
+    // Now that the provider is unpaused, pkg2's transforms finish and the
+    // overall build succeeds.
+    resumeProvider();
+    buildShouldSucceed();
+  });
+
+  test("one transformer takes a long time while the other finishes, then "
+      "the input is removed", () {
+    var rewrite1 = new RewriteTransformer("txt", "out1");
+    var rewrite2 = new RewriteTransformer("txt", "out2");
+    initGraph(["app|foo.txt"], {"app": [[rewrite1, rewrite2]]});
+
+    rewrite1.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+
+    // Wait for rewrite1 to pause and rewrite2 to finish.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+
+    // Make sure the removal is processed completely before we restart rewrite2.
+    schedule(pumpEventQueue);
+    rewrite1.resumeApply();
+
+    buildShouldSucceed();
+    expectNoAsset("app|foo.out1");
+    expectNoAsset("app|foo.out2");
+  });
+
+  test("a transformer in a later phase gets a slow secondary input from an "
+      "earlier phase", () {
+    var rewrite = new RewriteTransformer("in", "in");
+    initGraph({
+      "app|foo.in": "foo",
+      "app|bar.txt": "foo.in"
+    }, {"app": [
+      [rewrite],
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.in", "app|bar.txt"]);
+    expectAssetDoesNotComplete("app|bar.out");
+
+    rewrite.resumeApply();
+    expectAsset("app|bar.out", "foo.in");
+    buildShouldSucceed();
+  });
+}
diff --git a/pkg/barback/test/package_graph/transform/cross_package_test.dart b/pkg/barback/test/package_graph/transform/cross_package_test.dart
new file mode 100644
index 0000000..6aaf585
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/cross_package_test.dart
@@ -0,0 +1,226 @@
+// 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 barback.test.package_graph.transform.pass_through_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("can access other packages' source assets", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {"pkg1": [[new ManyToOneTransformer("txt")]]});
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+  });
+
+  test("can access other packages' transformed assets", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.txt": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new RewriteTransformer("txt", "inc")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
+    expectAsset("pkg1|a.out", "a.inc");
+    buildShouldSucceed();
+  });
+
+  test("re-runs a transform when an input from another package changes", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "new a");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "new a");
+    buildShouldSucceed();
+  });
+
+  test("re-runs a transform when a transformed input from another package "
+      "changes", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.txt": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new RewriteTransformer("txt", "inc")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
+    expectAsset("pkg1|a.out", "a.inc");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.txt", "new a");
+    updateSources(["pkg2|a.txt"]);
+    expectAsset("pkg1|a.out", "new a.inc");
+    buildShouldSucceed();
+  });
+
+  test("doesn't complete the build until all packages' transforms are "
+      "finished running", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[transformer]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+
+    transformer.pauseApply();
+    modifyAsset("pkg2|a.inc", "new a");
+    updateSources(["pkg2|a.inc"]);
+    buildShouldNotBeDone();
+
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("runs a transform that's added because of a change in another package",
+      () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "b"
+    }, {
+      "pkg1": [
+        [new ManyToOneTransformer("txt")],
+        [new OneToManyTransformer("out")],
+        [new RewriteTransformer("md", "done")]
+      ],
+    });
+
+    // pkg1|a.txt generates outputs based on the contents of pkg2|a.inc. At
+    // first pkg2|a.inc only includes "b", which is not transformed. Then
+    // pkg2|a.inc is updated to include "b,c.md". pkg1|c.md triggers the
+    // md->done rewrite transformer, producing pkg1|c.done.
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b,c.md");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    expectAsset("pkg1|c.done", "spread out.done");
+    buildShouldSucceed();
+  });
+
+  test("doesn't run a transform that's removed because of a change in "
+      "another package", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "b,c.md"
+    }, {
+      "pkg1": [
+        [new ManyToOneTransformer("txt")],
+        [new OneToManyTransformer("out")],
+        [new RewriteTransformer("md", "done")]
+      ],
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    expectAsset("pkg1|c.done", "spread out.done");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    expectNoAsset("pkg1|c.done");
+    buildShouldSucceed();
+  });
+
+  test("sees a transformer that's newly applied to a cross-package "
+      "dependency", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new CheckContentTransformer("b", " transformed")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "b transformed");
+    buildShouldSucceed();
+  });
+
+  test("doesn't see a transformer that's newly not applied to a "
+      "cross-package dependency", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new CheckContentTransformer("a", " transformed")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a transformed");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "b");
+    buildShouldSucceed();
+  });
+
+  test("re-runs if the primary input is invalidated before accessing", () {
+    var transformer1 = new RewriteTransformer("txt", "mid");
+    var transformer2 = new RewriteTransformer("mid", "out");
+
+    initGraph([
+      "app|foo.txt"
+    ], {"app": [
+      [transformer1],
+      [transformer2]
+    ]});
+
+    transformer2.pausePrimaryInput();
+    updateSources(["app|foo.txt"]);
+
+    // Wait long enough to ensure that transformer1 has completed and
+    // transformer2 has started.
+    schedule(pumpEventQueue);
+
+    // Update the source again so that transformer1 invalidates the primary
+    // input of transformer2.
+    transformer1.pauseApply();
+    updateSources(["app|foo.txt"]);
+
+    transformer2.resumePrimaryInput();
+    transformer1.resumeApply();
+
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+
+    expect(transformer1.numRuns, completion(equals(2)));
+    expect(transformer2.numRuns, completion(equals(2)));
+  });
+}
\ No newline at end of file
diff --git a/pkg/barback/test/package_graph/transform/pass_through_test.dart b/pkg/barback/test/package_graph/transform/pass_through_test.dart
new file mode 100644
index 0000000..eb90418
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/pass_through_test.dart
@@ -0,0 +1,273 @@
+// 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 barback.test.package_graph.transform.pass_through_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("passes an asset through a phase in which no transforms apply", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.zip",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new RewriteTransformer("zip", "zap")],
+      [new RewriteTransformer("mid", "out")],
+    ]});
+
+    updateSources(["app|foo.in", "app|bar.zip"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    expectAsset("app|bar.zap", "bar.zap");
+    buildShouldSucceed();
+  });
+
+  test("passes an asset through a phase in which a transform uses it", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new RewriteTransformer("mid", "phase2")],
+      [new RewriteTransformer("mid", "phase3")],
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.in", "foo");
+    expectAsset("app|foo.mid", "foo.mid");
+    expectAsset("app|foo.phase2", "foo.mid.phase2");
+    expectAsset("app|foo.phase3", "foo.mid.phase3");
+    buildShouldSucceed();
+  });
+
+  // If the asset were to get passed through, it might either cause a collision
+  // or silently supersede the overwriting asset. We want to assert that that
+  // doesn't happen.
+  test("doesn't pass an asset through a phase in which a transform "
+      "overwrites it", () {
+    initGraph([
+      "app|foo.txt"
+    ], {"app": [[new RewriteTransformer("txt", "txt")]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("removes a pass-through asset when the source is removed", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.zip",
+    ], {"app": [
+      [new RewriteTransformer("zip", "zap")],
+      [new RewriteTransformer("in", "out")],
+    ]});
+
+    updateSources(["app|foo.in", "app|bar.zip"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.in"]);
+    expectNoAsset("app|foo.in");
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("updates a pass-through asset when the source is updated", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.zip",
+    ], {"app": [
+      [new RewriteTransformer("zip", "zap")],
+      [new RewriteTransformer("in", "out")],
+    ]});
+
+    updateSources(["app|foo.in", "app|bar.zip"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.in", "boo");
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.out", "boo.out");
+    buildShouldSucceed();
+  });
+
+  test("passes an asset through a phase in which transforms have ceased to "
+      "apply", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new CheckContentTransformer("foo.mid", ".phase2")],
+      [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "foo.mid.phase2");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.in", "bar");
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "bar.mid.phase3");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through a phase in which transforms have "
+      "started to apply", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new CheckContentTransformer("bar.mid", ".phase2")],
+      [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "foo.mid.phase3");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.in", "bar");
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "bar.mid.phase2");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through if it's removed during isPrimary", () {
+    var check = new CheckContentTransformer("bar", " modified");
+    initGraph(["app|foo.txt"], {"app": [[check]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    check.pauseIsPrimary("app|foo.txt");
+    modifyAsset("app|foo.txt", "bar");
+    updateSources(["app|foo.txt"]);
+    // Ensure we're waiting on [check.isPrimary]
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    check.resumeIsPrimary("app|foo.txt");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("passes an asset through when its overwriting transform becomes "
+      "non-primary during apply", () {
+    var check = new CheckContentTransformer("yes", " modified");
+    initGraph({"app|foo.txt": "yes"}, {"app": [[check]]});
+
+    check.pauseApply();
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    check.resumeApply();
+
+    expectAsset("app|foo.txt", "no");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through when its overwriting transform becomes "
+      "non-primary during apply if another transform overwrites it", () {
+    var check = new CheckContentTransformer("yes", " modified");
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[check, new RewriteTransformer("txt", "txt")]]
+    });
+
+    check.pauseApply();
+    updateSources(["app|foo.txt"]);
+    // Ensure we're waiting on [check.apply]
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    check.resumeApply();
+
+    expectAsset("app|foo.txt", "no.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through when one overwriting transform becomes "
+      "non-primary if another transform still overwrites it", () {
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[
+        new CheckContentTransformer("yes", " modified"),
+        new RewriteTransformer("txt", "txt")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    // This could be either the output of [CheckContentTransformer] or
+    // [RewriteTransformer], depending which completes first.
+    expectAsset("app|foo.txt", anything);
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "no.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return a pass-through asset until we know it won't be "
+      "overwritten", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.a"], {"app": [[rewrite]]});
+
+    rewrite.pauseIsPrimary("app|foo.a");
+    updateSources(["app|foo.a"]);
+    expectAssetDoesNotComplete("app|foo.a");
+
+    rewrite.resumeIsPrimary("app|foo.a");
+    expectAsset("app|foo.a", "foo");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return a pass-through asset until we know it won't be "
+      "overwritten when secondary inputs change", () {
+    var manyToOne = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|foo.txt": "bar.in",
+      "app|bar.in": "bar"
+    }, {"app": [[manyToOne]]});
+
+    updateSources(["app|foo.txt", "app|bar.in"]);
+    expectAsset("app|foo.txt", "bar.in");
+    expectAsset("app|foo.out", "bar");
+
+    manyToOne.pauseApply();
+    updateSources(["app|bar.in"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    manyToOne.resumeApply();
+    expectAsset("app|foo.txt", "bar.in");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an overwritten asset until we know it will still "
+      "be overwritten", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+
+    rewrite.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    rewrite.resumeIsPrimary("app|foo.txt");
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/pkg/barback/test/package_graph/transform/transform_test.dart b/pkg/barback/test/package_graph/transform/transform_test.dart
new file mode 100644
index 0000000..747512c
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/transform_test.dart
@@ -0,0 +1,344 @@
+// 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 library contains tests for transformer behavior that relates to actions
+// happening concurrently or other complex asynchronous timing behavior.
+library barback.test.package_graph.transform.transform_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("gets a transformed asset with a different path", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("gets a transformed asset with the same path", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo.blub");
+    buildShouldSucceed();
+  });
+
+  test("doesn't find an output from a later phase", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("b", "c")],
+      [new RewriteTransformer("a", "b")]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectNoAsset("app|foo.c");
+    buildShouldSucceed();
+  });
+
+  test("doesn't find an output from the same phase", () {
+    initGraph(["app|foo.a"], {"app": [
+      [
+        new RewriteTransformer("a", "b"),
+        new RewriteTransformer("b", "c")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.b", "foo.b");
+    expectNoAsset("app|foo.c");
+    buildShouldSucceed();
+  });
+
+  test("finds the latest output before the transformer's phase", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blub")],
+      [
+        new RewriteTransformer("blub", "blub"),
+        new RewriteTransformer("blub", "done")
+      ],
+      [new RewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.done", "foo.blub.done");
+    buildShouldSucceed();
+  });
+
+  test("applies multiple transformations to an asset", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("a", "b")],
+      [new RewriteTransformer("b", "c")],
+      [new RewriteTransformer("c", "d")],
+      [new RewriteTransformer("d", "e")],
+      [new RewriteTransformer("e", "f")],
+      [new RewriteTransformer("f", "g")],
+      [new RewriteTransformer("g", "h")],
+      [new RewriteTransformer("h", "i")],
+      [new RewriteTransformer("i", "j")],
+      [new RewriteTransformer("j", "k")],
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.k", "foo.b.c.d.e.f.g.h.i.j.k");
+    buildShouldSucceed();
+  });
+
+  test("only runs a transform once for all of its outputs", () {
+    var transformer = new RewriteTransformer("blub", "a b c");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.a", "foo.a");
+    expectAsset("app|foo.b", "foo.b");
+    expectAsset("app|foo.c", "foo.c");
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("outputs are passed through transformers by default", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("a", "b")],
+      [new RewriteTransformer("a", "c")]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.a", "foo");
+    expectAsset("app|foo.b", "foo.b");
+    expectAsset("app|foo.c", "foo.c");
+    buildShouldSucceed();
+  });
+
+  test("does not reapply transform when inputs are not modified", () {
+    var transformer = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("reapplies a transform when its input is modified", () {
+    var transformer = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(3)));
+  });
+
+  test("does not reapply transform when a removed input is modified", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|a.txt": "a.inc,b.inc",
+      "app|a.inc": "a",
+      "app|b.inc": "b"
+    }, {"app": [[transformer]]});
+
+    updateSources(["app|a.txt", "app|a.inc", "app|b.inc"]);
+
+    expectAsset("app|a.out", "ab");
+    buildShouldSucceed();
+
+    // Remove the dependency on the non-primary input.
+    modifyAsset("app|a.txt", "a.inc");
+    updateSources(["app|a.txt"]);
+
+    // Process it again.
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+
+    // Now touch the removed input. It should not trigger another build.
+    updateSources(["app|b.inc"]);
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("allows a transform to generate multiple outputs", () {
+    initGraph({"app|foo.txt": "a.out,b.out"}, {"app": [
+      [new OneToManyTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+
+    expectAsset("app|a.out", "spread txt");
+    expectAsset("app|b.out", "spread txt");
+    buildShouldSucceed();
+  });
+
+  test("does not rebuild transforms that don't use modified source", () {
+    var a = new RewriteTransformer("a", "aa");
+    var aa = new RewriteTransformer("aa", "aaa");
+    var b = new RewriteTransformer("b", "bb");
+    var bb = new RewriteTransformer("bb", "bbb");
+    initGraph(["app|foo.a", "app|foo.b"], {"app": [
+      [a, b],
+      [aa, bb],
+    ]});
+
+    updateSources(["app|foo.a"]);
+    updateSources(["app|foo.b"]);
+
+    expectAsset("app|foo.aaa", "foo.aa.aaa");
+    expectAsset("app|foo.bbb", "foo.bb.bbb");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.aaa", "foo.aa.aaa");
+    expectAsset("app|foo.bbb", "foo.bb.bbb");
+    buildShouldSucceed();
+
+    expect(aa.numRuns, completion(equals(2)));
+    expect(bb.numRuns, completion(equals(1)));
+  });
+
+  test("doesn't get an output from a transform whose primary input is removed",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new RewriteTransformer("txt", "out")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("reapplies a transform when a non-primary input changes", () {
+    initGraph({
+      "app|a.txt": "a.inc",
+      "app|a.inc": "a"
+    }, {"app": [[new ManyToOneTransformer("txt")]]});
+
+    updateSources(["app|a.txt", "app|a.inc"]);
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+
+    modifyAsset("app|a.inc", "after");
+    updateSources(["app|a.inc"]);
+
+    expectAsset("app|a.out", "after");
+    buildShouldSucceed();
+  });
+
+  test("applies a transform when it becomes newly primary", () {
+    initGraph({
+      "app|foo.txt": "this",
+    }, {"app": [[new CheckContentTransformer("that", " and the other")]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "this");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "that");
+    updateSources(["app|foo.txt"]);
+
+    expectAsset("app|foo.txt", "that and the other");
+    buildShouldSucceed();
+  });
+
+  test("handles an output moving from one transformer to another", () {
+    // In the first run, "shared.out" is created by the "a.a" transformer.
+    initGraph({
+      "app|a.a": "a.out,shared.out",
+      "app|b.b": "b.out"
+    }, {"app": [
+      [new OneToManyTransformer("a"), new OneToManyTransformer("b")]
+    ]});
+
+    updateSources(["app|a.a", "app|b.b"]);
+
+    expectAsset("app|a.out", "spread a");
+    expectAsset("app|b.out", "spread b");
+    expectAsset("app|shared.out", "spread a");
+    buildShouldSucceed();
+
+    // Now switch their contents so that "shared.out" will be output by "b.b"'s
+    // transformer.
+    modifyAsset("app|a.a", "a.out");
+    modifyAsset("app|b.b", "b.out,shared.out");
+    updateSources(["app|a.a", "app|b.b"]);
+
+    expectAsset("app|a.out", "spread a");
+    expectAsset("app|b.out", "spread b");
+    expectAsset("app|shared.out", "spread b");
+    buildShouldSucceed();
+  });
+
+  test("applies transforms to the correct packages", () {
+    var rewrite1 = new RewriteTransformer("txt", "out1");
+    var rewrite2 = new RewriteTransformer("txt", "out2");
+    initGraph([
+      "pkg1|foo.txt",
+      "pkg2|foo.txt"
+    ], {"pkg1": [[rewrite1]], "pkg2": [[rewrite2]]});
+
+    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
+    expectAsset("pkg1|foo.out1", "foo.out1");
+    expectAsset("pkg2|foo.out2", "foo.out2");
+    buildShouldSucceed();
+  });
+
+  test("transforms don't see generated assets in other packages", () {
+    var fooToBar = new RewriteTransformer("foo", "bar");
+    var barToBaz = new RewriteTransformer("bar", "baz");
+    initGraph(["pkg1|file.foo"], {"pkg1": [[fooToBar]], "pkg2": [[barToBaz]]});
+
+    updateSources(["pkg1|file.foo"]);
+    expectAsset("pkg1|file.bar", "file.bar");
+    expectNoAsset("pkg2|file.baz");
+    buildShouldSucceed();
+  });
+
+  test("removes pipelined transforms when the root primary input is removed",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new RewriteTransformer("txt", "mid")],
+      [new RewriteTransformer("mid", "out")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("removes pipelined transforms when the parent ceases to generate the "
+      "primary input", () {
+    initGraph({"app|foo.txt": "foo.mid"}, {'app': [
+      [new OneToManyTransformer('txt')],
+      [new RewriteTransformer('mid', 'out')]
+    ]});
+
+    updateSources(['app|foo.txt']);
+    expectAsset('app|foo.out', 'spread txt.out');
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "bar.mid");
+    updateSources(["app|foo.txt"]);
+    expectNoAsset('app|foo.out');
+    expectAsset('app|bar.out', 'spread txt.out');
+    buildShouldSucceed();
+  });
+}
diff --git a/pkg/barback/test/package_graph/transform_test.dart b/pkg/barback/test/package_graph/transform_test.dart
deleted file mode 100644
index ae097a6..0000000
--- a/pkg/barback/test/package_graph/transform_test.dart
+++ /dev/null
@@ -1,1179 +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.
-
-library barback.test.package_graph.transform_test;
-
-import 'package:barback/src/utils.dart';
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../utils.dart';
-
-main() {
-  initConfig();
-  test("gets a transformed asset with a different path", () {
-    initGraph(["app|foo.blub"], {"app": [
-      [new RewriteTransformer("blub", "blab")]
-    ]});
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.blab", "foo.blab");
-    buildShouldSucceed();
-  });
-
-  test("gets a transformed asset with the same path", () {
-    initGraph(["app|foo.blub"], {"app": [
-      [new RewriteTransformer("blub", "blub")]
-    ]});
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.blub", "foo.blub");
-    buildShouldSucceed();
-  });
-
-  test("doesn't find an output from a later phase", () {
-    initGraph(["app|foo.a"], {"app": [
-      [new RewriteTransformer("b", "c")],
-      [new RewriteTransformer("a", "b")]
-    ]});
-    updateSources(["app|foo.a"]);
-    expectNoAsset("app|foo.c");
-    buildShouldSucceed();
-  });
-
-  test("doesn't find an output from the same phase", () {
-    initGraph(["app|foo.a"], {"app": [
-      [
-        new RewriteTransformer("a", "b"),
-        new RewriteTransformer("b", "c")
-      ]
-    ]});
-    updateSources(["app|foo.a"]);
-    expectAsset("app|foo.b", "foo.b");
-    expectNoAsset("app|foo.c");
-    buildShouldSucceed();
-  });
-
-  test("finds the latest output before the transformer's phase", () {
-    initGraph(["app|foo.blub"], {"app": [
-      [new RewriteTransformer("blub", "blub")],
-      [
-        new RewriteTransformer("blub", "blub"),
-        new RewriteTransformer("blub", "done")
-      ],
-      [new RewriteTransformer("blub", "blub")]
-    ]});
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.done", "foo.blub.done");
-    buildShouldSucceed();
-  });
-
-  test("applies multiple transformations to an asset", () {
-    initGraph(["app|foo.a"], {"app": [
-      [new RewriteTransformer("a", "b")],
-      [new RewriteTransformer("b", "c")],
-      [new RewriteTransformer("c", "d")],
-      [new RewriteTransformer("d", "e")],
-      [new RewriteTransformer("e", "f")],
-      [new RewriteTransformer("f", "g")],
-      [new RewriteTransformer("g", "h")],
-      [new RewriteTransformer("h", "i")],
-      [new RewriteTransformer("i", "j")],
-      [new RewriteTransformer("j", "k")],
-    ]});
-    updateSources(["app|foo.a"]);
-    expectAsset("app|foo.k", "foo.b.c.d.e.f.g.h.i.j.k");
-    buildShouldSucceed();
-  });
-
-  test("only runs a transform once for all of its outputs", () {
-    var transformer = new RewriteTransformer("blub", "a b c");
-    initGraph(["app|foo.blub"], {"app": [[transformer]]});
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.a", "foo.a");
-    expectAsset("app|foo.b", "foo.b");
-    expectAsset("app|foo.c", "foo.c");
-    buildShouldSucceed();
-    expect(transformer.numRuns, completion(equals(1)));
-  });
-
-  test("runs transforms in the same phase in parallel", () {
-    var transformerA = new RewriteTransformer("txt", "a");
-    var transformerB = new RewriteTransformer("txt", "b");
-    initGraph(["app|foo.txt"], {"app": [[transformerA, transformerB]]});
-
-    transformerA.pauseApply();
-    transformerB.pauseApply();
-
-    updateSources(["app|foo.txt"]);
-
-    transformerA.waitUntilStarted();
-    transformerB.waitUntilStarted();
-
-    // They should both still be running.
-    expect(transformerA.isRunning, completion(isTrue));
-    expect(transformerB.isRunning, completion(isTrue));
-
-    transformerA.resumeApply();
-    transformerB.resumeApply();
-
-    expectAsset("app|foo.a", "foo.a");
-    expectAsset("app|foo.b", "foo.b");
-    buildShouldSucceed();
-  });
-
-  test("outputs are inaccessible once used", () {
-    initGraph(["app|foo.a"], {"app": [
-      [new RewriteTransformer("a", "b")],
-      [new RewriteTransformer("a", "c")]
-    ]});
-    updateSources(["app|foo.a"]);
-    expectAsset("app|foo.b", "foo.b");
-    expectNoAsset("app|foo.a");
-    expectNoAsset("app|foo.c");
-    buildShouldSucceed();
-  });
-
-  test("does not reapply transform when inputs are not modified", () {
-    var transformer = new RewriteTransformer("blub", "blab");
-    initGraph(["app|foo.blub"], {"app": [[transformer]]});
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.blab", "foo.blab");
-    expectAsset("app|foo.blab", "foo.blab");
-    expectAsset("app|foo.blab", "foo.blab");
-    buildShouldSucceed();
-
-    expect(transformer.numRuns, completion(equals(1)));
-  });
-
-  test("reapplies a transform when its input is modified", () {
-    var transformer = new RewriteTransformer("blub", "blab");
-    initGraph(["app|foo.blub"], {"app": [[transformer]]});
-
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.blab", "foo.blab");
-    buildShouldSucceed();
-
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.blab", "foo.blab");
-    buildShouldSucceed();
-
-    updateSources(["app|foo.blub"]);
-    expectAsset("app|foo.blab", "foo.blab");
-    buildShouldSucceed();
-
-    expect(transformer.numRuns, completion(equals(3)));
-  });
-
-  test("does not reapply transform when a removed input is modified", () {
-    var transformer = new ManyToOneTransformer("txt");
-    initGraph({
-      "app|a.txt": "a.inc,b.inc",
-      "app|a.inc": "a",
-      "app|b.inc": "b"
-    }, {"app": [[transformer]]});
-
-    updateSources(["app|a.txt", "app|a.inc", "app|b.inc"]);
-
-    expectAsset("app|a.out", "ab");
-    buildShouldSucceed();
-
-    // Remove the dependency on the non-primary input.
-    modifyAsset("app|a.txt", "a.inc");
-    updateSources(["app|a.txt"]);
-
-    // Process it again.
-    expectAsset("app|a.out", "a");
-    buildShouldSucceed();
-
-    // Now touch the removed input. It should not trigger another build.
-    updateSources(["app|b.inc"]);
-    expectAsset("app|a.out", "a");
-    buildShouldSucceed();
-
-    expect(transformer.numRuns, completion(equals(2)));
-  });
-
-  test("allows a transform to generate multiple outputs", () {
-    initGraph({"app|foo.txt": "a.out,b.out"}, {"app": [
-      [new OneToManyTransformer("txt")]
-    ]});
-
-    updateSources(["app|foo.txt"]);
-
-    expectAsset("app|a.out", "spread txt");
-    expectAsset("app|b.out", "spread txt");
-    buildShouldSucceed();
-  });
-
-  test("does not rebuild transforms that don't use modified source", () {
-    var a = new RewriteTransformer("a", "aa");
-    var aa = new RewriteTransformer("aa", "aaa");
-    var b = new RewriteTransformer("b", "bb");
-    var bb = new RewriteTransformer("bb", "bbb");
-    initGraph(["app|foo.a", "app|foo.b"], {"app": [
-      [a, b],
-      [aa, bb],
-    ]});
-
-    updateSources(["app|foo.a"]);
-    updateSources(["app|foo.b"]);
-
-    expectAsset("app|foo.aaa", "foo.aa.aaa");
-    expectAsset("app|foo.bbb", "foo.bb.bbb");
-    buildShouldSucceed();
-
-    updateSources(["app|foo.a"]);
-    expectAsset("app|foo.aaa", "foo.aa.aaa");
-    expectAsset("app|foo.bbb", "foo.bb.bbb");
-    buildShouldSucceed();
-
-    expect(aa.numRuns, completion(equals(2)));
-    expect(bb.numRuns, completion(equals(1)));
-  });
-
-  test("doesn't get an output from a transform whose primary input is removed",
-      () {
-    initGraph(["app|foo.txt"], {"app": [
-      [new RewriteTransformer("txt", "out")]
-    ]});
-
-    updateSources(["app|foo.txt"]);
-    expectAsset("app|foo.out", "foo.out");
-    buildShouldSucceed();
-
-    removeSources(["app|foo.txt"]);
-    expectNoAsset("app|foo.out");
-    buildShouldSucceed();
-  });
-
-  test("discards outputs from a transform whose primary input is removed "
-      "during processing", () {
-    var rewrite = new RewriteTransformer("txt", "out");
-    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
-
-    rewrite.pauseApply();
-    updateSources(["app|foo.txt"]);
-    rewrite.waitUntilStarted();
-
-    removeSources(["app|foo.txt"]);
-    rewrite.resumeApply();
-    expectNoAsset("app|foo.out");
-    buildShouldSucceed();
-  });
-
-  test("reapplies a transform when a non-primary input changes", () {
-    initGraph({
-      "app|a.txt": "a.inc",
-      "app|a.inc": "a"
-    }, {"app": [[new ManyToOneTransformer("txt")]]});
-
-    updateSources(["app|a.txt", "app|a.inc"]);
-    expectAsset("app|a.out", "a");
-    buildShouldSucceed();
-
-    modifyAsset("app|a.inc", "after");
-    updateSources(["app|a.inc"]);
-
-    expectAsset("app|a.out", "after");
-    buildShouldSucceed();
-  });
-
-  test("applies a transform when it becomes newly primary", () {
-    initGraph({
-      "app|foo.txt": "this",
-    }, {"app": [[new CheckContentTransformer("that", " and the other")]]});
-
-    updateSources(["app|foo.txt"]);
-    expectAsset("app|foo.txt", "this");
-    buildShouldSucceed();
-
-    modifyAsset("app|foo.txt", "that");
-    updateSources(["app|foo.txt"]);
-
-    expectAsset("app|foo.txt", "that and the other");
-    buildShouldSucceed();
-  });
-
-  test("applies the correct transform if an asset is modified during isPrimary",
-      () {
-    var check1 = new CheckContentTransformer("first", "#1");
-    var check2 = new CheckContentTransformer("second", "#2");
-    initGraph({
-      "app|foo.txt": "first",
-    }, {"app": [[check1, check2]]});
-
-    check1.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    // Ensure that we're waiting on check1's isPrimary.
-    schedule(pumpEventQueue);
-
-    modifyAsset("app|foo.txt", "second");
-    updateSources(["app|foo.txt"]);
-    check1.resumeIsPrimary("app|foo.txt");
-
-    expectAsset("app|foo.txt", "second#2");
-    buildShouldSucceed();
-  });
-
-  test("applies the correct transform if an asset is removed and added during "
-      "isPrimary", () {
-    var check1 = new CheckContentTransformer("first", "#1");
-    var check2 = new CheckContentTransformer("second", "#2");
-    initGraph({
-      "app|foo.txt": "first",
-    }, {"app": [[check1, check2]]});
-
-    check1.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    // Ensure that we're waiting on check1's isPrimary.
-    schedule(pumpEventQueue);
-
-    removeSources(["app|foo.txt"]);
-    modifyAsset("app|foo.txt", "second");
-    updateSources(["app|foo.txt"]);
-    check1.resumeIsPrimary("app|foo.txt");
-
-    expectAsset("app|foo.txt", "second#2");
-    buildShouldSucceed();
-  });
-
-  test("restarts processing if a change occurs during processing", () {
-    var transformer = new RewriteTransformer("txt", "out");
-    initGraph(["app|foo.txt"], {"app": [[transformer]]});
-
-    transformer.pauseApply();
-
-    updateSources(["app|foo.txt"]);
-    transformer.waitUntilStarted();
-
-    // Now update the graph during it.
-    updateSources(["app|foo.txt"]);
-    transformer.resumeApply();
-
-    expectAsset("app|foo.out", "foo.out");
-    buildShouldSucceed();
-
-    expect(transformer.numRuns, completion(equals(2)));
-  });
-
-  test("aborts processing if the primary input is removed during processing",
-      () {
-    var transformer = new RewriteTransformer("txt", "out");
-    initGraph(["app|foo.txt"], {"app": [[transformer]]});
-
-    transformer.pauseApply();
-
-    updateSources(["app|foo.txt"]);
-    transformer.waitUntilStarted();
-
-    // Now remove its primary input while it's running.
-    removeSources(["app|foo.txt"]);
-    transformer.resumeApply();
-
-    expectNoAsset("app|foo.out");
-    buildShouldSucceed();
-
-    expect(transformer.numRuns, completion(equals(1)));
-  });
-
-  test("restarts processing if a change to a new secondary input occurs during "
-      "processing", () {
-    var transformer = new ManyToOneTransformer("txt");
-    initGraph({
-      "app|foo.txt": "bar.inc",
-      "app|bar.inc": "bar"
-    }, {"app": [[transformer]]});
-
-    transformer.pauseApply();
-
-    updateSources(["app|foo.txt", "app|bar.inc"]);
-    transformer.waitUntilStarted();
-
-    // Give the transform time to load bar.inc the first time.
-    schedule(pumpEventQueue);
-
-    // Now update the secondary input before the transform finishes.
-    modifyAsset("app|bar.inc", "baz");
-    updateSources(["app|bar.inc"]);
-    // Give bar.inc enough time to be loaded and marked available before the
-    // transformer completes.
-    schedule(pumpEventQueue);
-
-    transformer.resumeApply();
-
-    expectAsset("app|foo.out", "baz");
-    buildShouldSucceed();
-
-    expect(transformer.numRuns, completion(equals(2)));
-  });
-
-  test("doesn't restart processing if a change to an old secondary input "
-      "occurs during processing", () {
-    var transformer = new ManyToOneTransformer("txt");
-    initGraph({
-      "app|foo.txt": "bar.inc",
-      "app|bar.inc": "bar",
-      "app|baz.inc": "baz"
-    }, {"app": [[transformer]]});
-
-    updateSources(["app|foo.txt", "app|bar.inc", "app|baz.inc"]);
-    expectAsset("app|foo.out", "bar");
-    buildShouldSucceed();
-
-    transformer.pauseApply();
-    modifyAsset("app|foo.txt", "baz.inc");
-    updateSources(["app|foo.txt"]);
-    transformer.waitUntilStarted();
-
-    // Now update the old secondary input before the transform finishes.
-    modifyAsset("app|bar.inc", "new bar");
-    updateSources(["app|bar.inc"]);
-    // Give bar.inc enough time to be loaded and marked available before the
-    // transformer completes.
-    schedule(pumpEventQueue);
-
-    transformer.resumeApply();
-    expectAsset("app|foo.out", "baz");
-    buildShouldSucceed();
-
-    // Should have run once the first time, then again when switching to
-    // baz.inc. Should not run a third time because of bar.inc being modified.
-    expect(transformer.numRuns, completion(equals(2)));
-  });
-
-  test("handles an output moving from one transformer to another", () {
-    // In the first run, "shared.out" is created by the "a.a" transformer.
-    initGraph({
-      "app|a.a": "a.out,shared.out",
-      "app|b.b": "b.out"
-    }, {"app": [
-      [new OneToManyTransformer("a"), new OneToManyTransformer("b")]
-    ]});
-
-    updateSources(["app|a.a", "app|b.b"]);
-
-    expectAsset("app|a.out", "spread a");
-    expectAsset("app|b.out", "spread b");
-    expectAsset("app|shared.out", "spread a");
-    buildShouldSucceed();
-
-    // Now switch their contents so that "shared.out" will be output by "b.b"'s
-    // transformer.
-    modifyAsset("app|a.a", "a.out");
-    modifyAsset("app|b.b", "b.out,shared.out");
-    updateSources(["app|a.a", "app|b.b"]);
-
-    expectAsset("app|a.out", "spread a");
-    expectAsset("app|b.out", "spread b");
-    expectAsset("app|shared.out", "spread b");
-    buildShouldSucceed();
-  });
-
-  test("restarts before finishing later phases when a change occurs", () {
-    var txtToInt = new RewriteTransformer("txt", "int");
-    var intToOut = new RewriteTransformer("int", "out");
-    initGraph(["app|foo.txt", "app|bar.txt"],
-        {"app": [[txtToInt], [intToOut]]});
-
-    txtToInt.pauseApply();
-
-    updateSources(["app|foo.txt"]);
-    txtToInt.waitUntilStarted();
-
-    // Now update the graph during it.
-    updateSources(["app|bar.txt"]);
-    txtToInt.resumeApply();
-
-    expectAsset("app|foo.out", "foo.int.out");
-    expectAsset("app|bar.out", "bar.int.out");
-    buildShouldSucceed();
-
-    // Should only have run each transform once for each primary.
-    expect(txtToInt.numRuns, completion(equals(2)));
-    expect(intToOut.numRuns, completion(equals(2)));
-  });
-
-  test("applies transforms to the correct packages", () {
-    var rewrite1 = new RewriteTransformer("txt", "out1");
-    var rewrite2 = new RewriteTransformer("txt", "out2");
-    initGraph([
-      "pkg1|foo.txt",
-      "pkg2|foo.txt"
-    ], {"pkg1": [[rewrite1]], "pkg2": [[rewrite2]]});
-
-    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
-    expectAsset("pkg1|foo.out1", "foo.out1");
-    expectAsset("pkg2|foo.out2", "foo.out2");
-    buildShouldSucceed();
-  });
-
-  test("transforms don't see generated assets in other packages", () {
-    var fooToBar = new RewriteTransformer("foo", "bar");
-    var barToBaz = new RewriteTransformer("bar", "baz");
-    initGraph(["pkg1|file.foo"], {"pkg1": [[fooToBar]], "pkg2": [[barToBaz]]});
-
-    updateSources(["pkg1|file.foo"]);
-    expectAsset("pkg1|file.bar", "file.bar");
-    expectNoAsset("pkg2|file.baz");
-    buildShouldSucceed();
-  });
-
-  test("doesn't return an asset until it's finished rebuilding", () {
-    initGraph(["app|foo.in"], {"app": [
-      [new RewriteTransformer("in", "mid")],
-      [new RewriteTransformer("mid", "out")]
-    ]});
-
-    updateSources(["app|foo.in"]);
-    expectAsset("app|foo.out", "foo.mid.out");
-    buildShouldSucceed();
-
-    pauseProvider();
-    modifyAsset("app|foo.in", "new");
-    updateSources(["app|foo.in"]);
-    expectAssetDoesNotComplete("app|foo.out");
-    buildShouldNotBeDone();
-
-    resumeProvider();
-    expectAsset("app|foo.out", "new.mid.out");
-    buildShouldSucceed();
-  });
-
-  test("doesn't return an asset until its in-place transform is done", () {
-    var rewrite = new RewriteTransformer("txt", "txt");
-    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
-
-    rewrite.pauseApply();
-    updateSources(["app|foo.txt"]);
-    expectAssetDoesNotComplete("app|foo.txt");
-
-    rewrite.resumeApply();
-    expectAsset("app|foo.txt", "foo.txt");
-    buildShouldSucceed();
-  });
-
-  test("doesn't return an asset until we know it won't be transformed",
-      () {
-    var rewrite = new RewriteTransformer("txt", "txt");
-    initGraph(["app|foo.a"], {"app": [[rewrite]]});
-
-    rewrite.pauseIsPrimary("app|foo.a");
-    updateSources(["app|foo.a"]);
-    expectAssetDoesNotComplete("app|foo.a");
-
-    rewrite.resumeIsPrimary("app|foo.a");
-    expectAsset("app|foo.a", "foo");
-    buildShouldSucceed();
-  });
-
-  test("doesn't return a modified asset until we know it will still be "
-      "transformed", () {
-    var rewrite = new RewriteTransformer("txt", "txt");
-    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
-
-    updateSources(["app|foo.txt"]);
-    expectAsset("app|foo.txt", "foo.txt");
-    buildShouldSucceed();
-
-    rewrite.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    expectAssetDoesNotComplete("app|foo.txt");
-
-    rewrite.resumeIsPrimary("app|foo.txt");
-    expectAsset("app|foo.txt", "foo.txt");
-    buildShouldSucceed();
-  });
-
-  test("doesn't return an asset that's removed during isPrimary", () {
-    var rewrite = new RewriteTransformer("txt", "txt");
-    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
-
-    rewrite.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    // Make sure we're waiting on isPrimary.
-    schedule(pumpEventQueue);
-
-    removeSources(["app|foo.txt"]);
-    rewrite.resumeIsPrimary("app|foo.txt");
-    expectNoAsset("app|foo.txt");
-    buildShouldSucceed();
-  });
-
-  test("doesn't transform an asset that goes from primary to non-primary "
-      "during isPrimary", () {
-    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
-    initGraph({
-      "app|foo.txt": "do"
-    }, {"app": [[check]]});
-
-    check.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    // Make sure we're waiting on isPrimary.
-    schedule(pumpEventQueue);
-
-    modifyAsset("app|foo.txt", "don't");
-    updateSources(["app|foo.txt"]);
-    check.resumeIsPrimary("app|foo.txt");
-
-    expectAsset("app|foo.txt", "don't");
-    buildShouldSucceed();
-  });
-
-  test("transforms an asset that goes from non-primary to primary "
-      "during isPrimary", () {
-    var check = new CheckContentTransformer("do", "ne");
-    initGraph({
-      "app|foo.txt": "don't"
-    }, {"app": [[check]]});
-
-    check.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    // Make sure we're waiting on isPrimary.
-    schedule(pumpEventQueue);
-
-    modifyAsset("app|foo.txt", "do");
-    updateSources(["app|foo.txt"]);
-    check.resumeIsPrimary("app|foo.txt");
-
-    expectAsset("app|foo.txt", "done");
-    buildShouldSucceed();
-  });
-
-  test("doesn't return an asset that's removed during another transformer's "
-      "isPrimary", () {
-    var rewrite1 = new RewriteTransformer("txt", "txt");
-    var rewrite2 = new RewriteTransformer("md", "md");
-    initGraph(["app|foo.txt", "app|foo.md"], {"app": [[rewrite1, rewrite2]]});
-
-    rewrite2.pauseIsPrimary("app|foo.md");
-    updateSources(["app|foo.txt", "app|foo.md"]);
-    // Make sure we're waiting on the correct isPrimary.
-    schedule(pumpEventQueue);
-
-    removeSources(["app|foo.txt"]);
-    rewrite2.resumeIsPrimary("app|foo.md");
-    expectNoAsset("app|foo.txt");
-    expectAsset("app|foo.md", "foo.md");
-    buildShouldSucceed();
-  });
-
-  test("doesn't transform an asset that goes from primary to non-primary "
-      "during another transformer's isPrimary", () {
-    var rewrite = new RewriteTransformer("md", "md");
-    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
-    initGraph({
-      "app|foo.txt": "do",
-      "app|foo.md": "foo"
-    }, {"app": [[rewrite, check]]});
-
-    rewrite.pauseIsPrimary("app|foo.md");
-    updateSources(["app|foo.txt", "app|foo.md"]);
-    // Make sure we're waiting on the correct isPrimary.
-    schedule(pumpEventQueue);
-
-    modifyAsset("app|foo.txt", "don't");
-    updateSources(["app|foo.txt"]);
-    rewrite.resumeIsPrimary("app|foo.md");
-
-    expectAsset("app|foo.txt", "don't");
-    expectAsset("app|foo.md", "foo.md");
-    buildShouldSucceed();
-  });
-
-  test("transforms an asset that goes from non-primary to primary "
-      "during another transformer's isPrimary", () {
-    var rewrite = new RewriteTransformer("md", "md");
-    var check = new CheckContentTransformer("do", "ne");
-    initGraph({
-      "app|foo.txt": "don't",
-      "app|foo.md": "foo"
-    }, {"app": [[rewrite, check]]});
-
-    rewrite.pauseIsPrimary("app|foo.md");
-    updateSources(["app|foo.txt", "app|foo.md"]);
-    // Make sure we're waiting on the correct isPrimary.
-    schedule(pumpEventQueue);
-
-    modifyAsset("app|foo.txt", "do");
-    updateSources(["app|foo.txt"]);
-    rewrite.resumeIsPrimary("app|foo.md");
-
-    expectAsset("app|foo.txt", "done");
-    expectAsset("app|foo.md", "foo.md");
-    buildShouldSucceed();
-  });
-
-  test("removes pipelined transforms when the root primary input is removed",
-      () {
-    initGraph(["app|foo.txt"], {"app": [
-      [new RewriteTransformer("txt", "mid")],
-      [new RewriteTransformer("mid", "out")]
-    ]});
-
-    updateSources(["app|foo.txt"]);
-    expectAsset("app|foo.out", "foo.mid.out");
-    buildShouldSucceed();
-
-    removeSources(["app|foo.txt"]);
-    expectNoAsset("app|foo.out");
-    buildShouldSucceed();
-  });
-
-  test("removes pipelined transforms when the parent ceases to generate the "
-      "primary input", () {
-    initGraph({"app|foo.txt": "foo.mid"}, {'app': [
-      [new OneToManyTransformer('txt')],
-      [new RewriteTransformer('mid', 'out')]
-    ]});
-
-    updateSources(['app|foo.txt']);
-    expectAsset('app|foo.out', 'spread txt.out');
-    buildShouldSucceed();
-
-    modifyAsset("app|foo.txt", "bar.mid");
-    updateSources(["app|foo.txt"]);
-    expectNoAsset('app|foo.out');
-    expectAsset('app|bar.out', 'spread txt.out');
-    buildShouldSucceed();
-  });
-
-  test("returns an asset even if an unrelated build is running", () {
-    initGraph([
-      "app|foo.in",
-      "app|bar.in",
-    ], {"app": [[new RewriteTransformer("in", "out")]]});
-
-    updateSources(["app|foo.in", "app|bar.in"]);
-    expectAsset("app|foo.out", "foo.out");
-    expectAsset("app|bar.out", "bar.out");
-    buildShouldSucceed();
-
-    pauseProvider();
-    modifyAsset("app|foo.in", "new");
-    updateSources(["app|foo.in"]);
-    expectAssetDoesNotComplete("app|foo.out");
-    expectAsset("app|bar.out", "bar.out");
-    buildShouldNotBeDone();
-
-    resumeProvider();
-    expectAsset("app|foo.out", "new.out");
-    buildShouldSucceed();
-  });
-
-  test("doesn't report AssetNotFound until all builds are finished", () {
-    initGraph([
-      "app|foo.in",
-    ], {"app": [[new RewriteTransformer("in", "out")]]});
-
-    updateSources(["app|foo.in"]);
-    expectAsset("app|foo.out", "foo.out");
-    buildShouldSucceed();
-
-    pauseProvider();
-    updateSources(["app|foo.in"]);
-    expectAssetDoesNotComplete("app|foo.out");
-    expectAssetDoesNotComplete("app|non-existent.out");
-    buildShouldNotBeDone();
-
-    resumeProvider();
-    expectAsset("app|foo.out", "foo.out");
-    expectNoAsset("app|non-existent.out");
-    buildShouldSucceed();
-  });
-
-  test("doesn't emit a result until all builds are finished", () {
-    var rewrite = new RewriteTransformer("txt", "out");
-    initGraph([
-      "pkg1|foo.txt",
-      "pkg2|foo.txt"
-    ], {"pkg1": [[rewrite]], "pkg2": [[rewrite]]});
-
-    // First, run both packages' transformers so both packages are successful.
-    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
-    expectAsset("pkg1|foo.out", "foo.out");
-    expectAsset("pkg2|foo.out", "foo.out");
-    buildShouldSucceed();
-
-    // pkg1 is still successful, but pkg2 is waiting on the provider, so the
-    // overall build shouldn't finish.
-    pauseProvider();
-    updateSources(["pkg2|foo.txt"]);
-    expectAsset("pkg1|foo.out", "foo.out");
-    buildShouldNotBeDone();
-
-    // Now that the provider is unpaused, pkg2's transforms finish and the
-    // overall build succeeds.
-    resumeProvider();
-    buildShouldSucceed();
-  });
-
-  test("one transformer takes a long time while the other finishes, then "
-      "the input is removed", () {
-    var rewrite1 = new RewriteTransformer("txt", "out1");
-    var rewrite2 = new RewriteTransformer("txt", "out2");
-    initGraph(["app|foo.txt"], {"app": [[rewrite1, rewrite2]]});
-
-    rewrite1.pauseApply();
-
-    updateSources(["app|foo.txt"]);
-
-    // Wait for rewrite1 to pause and rewrite2 to finish.
-    schedule(pumpEventQueue);
-
-    removeSources(["app|foo.txt"]);
-
-    // Make sure the removal is processed completely before we restart rewrite2.
-    schedule(pumpEventQueue);
-    rewrite1.resumeApply();
-
-    buildShouldSucceed();
-    expectNoAsset("app|foo.out1");
-    expectNoAsset("app|foo.out2");
-  });
-
-  group("pass-through", () {
-    test("passes an asset through a phase in which no transforms apply", () {
-      initGraph([
-        "app|foo.in",
-        "app|bar.zip",
-      ], {"app": [
-        [new RewriteTransformer("in", "mid")],
-        [new RewriteTransformer("zip", "zap")],
-        [new RewriteTransformer("mid", "out")],
-      ]});
-
-      updateSources(["app|foo.in", "app|bar.zip"]);
-      expectAsset("app|foo.out", "foo.mid.out");
-      expectAsset("app|bar.zap", "bar.zap");
-      buildShouldSucceed();
-    });
-
-    test("doesn't pass an asset through a phase in which a transform consumes "
-        "it", () {
-      initGraph([
-        "app|foo.in",
-      ], {"app": [
-        [new RewriteTransformer("in", "mid")],
-        [new RewriteTransformer("mid", "phase2")],
-        [new RewriteTransformer("mid", "phase3")],
-      ]});
-
-      updateSources(["app|foo.in"]);
-      expectAsset("app|foo.phase2", "foo.mid.phase2");
-      expectNoAsset("app|foo.phase3");
-      buildShouldSucceed();
-    });
-
-    test("removes a pass-through asset when the source is removed", () {
-      initGraph([
-        "app|foo.in",
-        "app|bar.zip",
-      ], {"app": [
-        [new RewriteTransformer("zip", "zap")],
-        [new RewriteTransformer("in", "out")],
-      ]});
-
-      updateSources(["app|foo.in", "app|bar.zip"]);
-      expectAsset("app|foo.out", "foo.out");
-      buildShouldSucceed();
-
-      removeSources(["app|foo.in"]);
-      expectNoAsset("app|foo.in");
-      expectNoAsset("app|foo.out");
-      buildShouldSucceed();
-    });
-
-    test("updates a pass-through asset when the source is updated", () {
-      initGraph([
-        "app|foo.in",
-        "app|bar.zip",
-      ], {"app": [
-        [new RewriteTransformer("zip", "zap")],
-        [new RewriteTransformer("in", "out")],
-      ]});
-
-      updateSources(["app|foo.in", "app|bar.zip"]);
-      expectAsset("app|foo.out", "foo.out");
-      buildShouldSucceed();
-
-      modifyAsset("app|foo.in", "boo");
-      updateSources(["app|foo.in"]);
-      expectAsset("app|foo.out", "boo.out");
-      buildShouldSucceed();
-    });
-
-    test("passes an asset through a phase in which transforms have ceased to "
-        "apply", () {
-      initGraph([
-        "app|foo.in",
-      ], {"app": [
-        [new RewriteTransformer("in", "mid")],
-        [new CheckContentTransformer("foo.mid", ".phase2")],
-        [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
-      ]});
-
-      updateSources(["app|foo.in"]);
-      expectAsset("app|foo.mid", "foo.mid.phase2");
-      buildShouldSucceed();
-
-      modifyAsset("app|foo.in", "bar");
-      updateSources(["app|foo.in"]);
-      expectAsset("app|foo.mid", "bar.mid.phase3");
-      buildShouldSucceed();
-    });
-
-    test("doesn't pass an asset through a phase in which transforms have "
-        "started to apply", () {
-      initGraph([
-        "app|foo.in",
-      ], {"app": [
-        [new RewriteTransformer("in", "mid")],
-        [new CheckContentTransformer("bar.mid", ".phase2")],
-        [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
-      ]});
-
-      updateSources(["app|foo.in"]);
-      expectAsset("app|foo.mid", "foo.mid.phase3");
-      buildShouldSucceed();
-
-      modifyAsset("app|foo.in", "bar");
-      updateSources(["app|foo.in"]);
-      expectAsset("app|foo.mid", "bar.mid.phase2");
-      buildShouldSucceed();
-    });
-
-    test("doesn't pass an asset through if it's removed during isPrimary", () {
-      var check = new CheckContentTransformer("bar", " modified");
-      initGraph(["app|foo.txt"], {"app": [[check]]});
-
-      updateSources(["app|foo.txt"]);
-      expectAsset("app|foo.txt", "foo");
-      buildShouldSucceed();
-
-      check.pauseIsPrimary("app|foo.txt");
-      modifyAsset("app|foo.txt", "bar");
-      updateSources(["app|foo.txt"]);
-      // Ensure we're waiting on [check.isPrimary]
-      schedule(pumpEventQueue);
-
-      removeSources(["app|foo.txt"]);
-      check.resumeIsPrimary("app|foo.txt");
-      expectNoAsset("app|foo.txt");
-      buildShouldSucceed();
-    });
-  });
-
-  group('cross-package transforms', () {
-    test("can access other packages' source assets", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "a"
-      }, {"pkg1": [[new ManyToOneTransformer("txt")]]});
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "a");
-      buildShouldSucceed();
-    });
-
-    test("can access other packages' transformed assets", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.txt": "a"
-      }, {
-        "pkg1": [[new ManyToOneTransformer("txt")]],
-        "pkg2": [[new RewriteTransformer("txt", "inc")]]
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
-      expectAsset("pkg1|a.out", "a.inc");
-      buildShouldSucceed();
-    });
-
-    test("re-runs a transform when an input from another package changes", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "a"
-      }, {
-        "pkg1": [[new ManyToOneTransformer("txt")]]
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "a");
-      buildShouldSucceed();
-
-      modifyAsset("pkg2|a.inc", "new a");
-      updateSources(["pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "new a");
-      buildShouldSucceed();
-    });
-
-    test("re-runs a transform when a transformed input from another package "
-        "changes", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.txt": "a"
-      }, {
-        "pkg1": [[new ManyToOneTransformer("txt")]],
-        "pkg2": [[new RewriteTransformer("txt", "inc")]]
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
-      expectAsset("pkg1|a.out", "a.inc");
-      buildShouldSucceed();
-
-      modifyAsset("pkg2|a.txt", "new a");
-      updateSources(["pkg2|a.txt"]);
-      expectAsset("pkg1|a.out", "new a.inc");
-      buildShouldSucceed();
-    });
-
-    test("doesn't complete the build until all packages' transforms are "
-        "finished running", () {
-      var transformer = new ManyToOneTransformer("txt");
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "a"
-      }, {
-        "pkg1": [[transformer]]
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "a");
-      buildShouldSucceed();
-
-      transformer.pauseApply();
-      modifyAsset("pkg2|a.inc", "new a");
-      updateSources(["pkg2|a.inc"]);
-      buildShouldNotBeDone();
-
-      transformer.resumeApply();
-      buildShouldSucceed();
-    });
-
-    test("runs a transform that's added because of a change in another package",
-        () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "b"
-      }, {
-        "pkg1": [
-          [new ManyToOneTransformer("txt")],
-          [new OneToManyTransformer("out")],
-          [new RewriteTransformer("md", "done")]
-        ],
-      });
-
-      // pkg1|a.txt generates outputs based on the contents of pkg2|a.inc. At
-      // first pkg2|a.inc only includes "b", which is not transformed. Then
-      // pkg2|a.inc is updated to include "b,c.md". pkg1|c.md triggers the
-      // md->done rewrite transformer, producing pkg1|c.done.
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|b", "spread out");
-      buildShouldSucceed();
-
-      modifyAsset("pkg2|a.inc", "b,c.md");
-      updateSources(["pkg2|a.inc"]);
-      expectAsset("pkg1|b", "spread out");
-      expectAsset("pkg1|c.done", "spread out.done");
-      buildShouldSucceed();
-    });
-
-    test("doesn't run a transform that's removed because of a change in "
-        "another package", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "b,c.md"
-      }, {
-        "pkg1": [
-          [new ManyToOneTransformer("txt")],
-          [new OneToManyTransformer("out")],
-          [new RewriteTransformer("md", "done")]
-        ],
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|b", "spread out");
-      expectAsset("pkg1|c.done", "spread out.done");
-      buildShouldSucceed();
-
-      modifyAsset("pkg2|a.inc", "b");
-      updateSources(["pkg2|a.inc"]);
-      expectAsset("pkg1|b", "spread out");
-      expectNoAsset("pkg1|c.done");
-      buildShouldSucceed();
-    });
-
-    test("sees a transformer that's newly applied to a cross-package "
-        "dependency", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "a"
-      }, {
-        "pkg1": [[new ManyToOneTransformer("txt")]],
-        "pkg2": [[new CheckContentTransformer("b", " transformed")]]
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "a");
-      buildShouldSucceed();
-
-      modifyAsset("pkg2|a.inc", "b");
-      updateSources(["pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "b transformed");
-      buildShouldSucceed();
-    });
-
-    test("doesn't see a transformer that's newly not applied to a "
-        "cross-package dependency", () {
-      initGraph({
-        "pkg1|a.txt": "pkg2|a.inc",
-        "pkg2|a.inc": "a"
-      }, {
-        "pkg1": [[new ManyToOneTransformer("txt")]],
-        "pkg2": [[new CheckContentTransformer("a", " transformed")]]
-      });
-
-      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "a transformed");
-      buildShouldSucceed();
-
-      modifyAsset("pkg2|a.inc", "b");
-      updateSources(["pkg2|a.inc"]);
-      expectAsset("pkg1|a.out", "b");
-      buildShouldSucceed();
-    });
-
-    test("re-runs if the primary input is invalidated before accessing", () {
-      var transformer1 = new RewriteTransformer("txt", "mid");
-      var transformer2 = new RewriteTransformer("mid", "out");
-
-      initGraph([
-        "app|foo.txt"
-      ], {"app": [
-        [transformer1],
-        [transformer2]
-      ]});
-
-      transformer2.pausePrimaryInput();
-      updateSources(["app|foo.txt"]);
-
-      // Wait long enough to ensure that transformer1 has completed and
-      // transformer2 has started.
-      schedule(pumpEventQueue);
-
-      // Update the source again so that transformer1 invalidates the primary
-      // input of transformer2.
-      transformer1.pauseApply();
-      updateSources(["app|foo.txt"]);
-
-      transformer2.resumePrimaryInput();
-      transformer1.resumeApply();
-
-      expectAsset("app|foo.out", "foo.mid.out");
-      buildShouldSucceed();
-
-      expect(transformer1.numRuns, completion(equals(2)));
-      expect(transformer2.numRuns, completion(equals(2)));
-    });
-  });
-}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 7da5977..53df906 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -98,7 +98,7 @@
   _nextBuildResult = 0;
   _nextLog = 0;
 
-  transformers.forEach(_barback.updateTransformers);
+  schedule(() => transformers.forEach(_barback.updateTransformers));
 
   // There should be one successful build after adding all the transformers but
   // before adding any sources.
@@ -249,9 +249,10 @@
 /// Schedules an expectation that the graph will deliver an asset matching
 /// [name] and [contents].
 ///
-/// If [contents] is omitted, defaults to the asset's filename without an
-/// extension (which is the same default that [initGraph] uses).
-void expectAsset(String name, [String contents]) {
+/// [contents] may be a [String] or a [Matcher] that matches a string. If
+/// [contents] is omitted, defaults to the asset's filename without an extension
+/// (which is the same default that [initGraph] uses).
+void expectAsset(String name, [contents]) {
   var id = new AssetId.parse(name);
 
   if (contents == null) {
@@ -262,7 +263,7 @@
     return _barback.getAssetById(id).then((asset) {
       // TODO(rnystrom): Make an actual Matcher class for this.
       expect(asset.id, equals(id));
-      expect(asset.readAsString(), completion(equals(contents)));
+      expect(asset.readAsString(), completion(contents));
     });
   }, "get asset $name");
 }
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 9f6ce06..5b4aaef 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -128,7 +128,7 @@
             .forEach(processAsset);
 
       }, onError: (e) {
-        _context.applyChanges(new ChangeSet()..removed(sources[assetId]));
+        _context.applyChanges(new ChangeSet()..removedSource(sources[assetId]));
         sources.remove(assetId);
       }));
     }
@@ -140,7 +140,7 @@
       var changeSet = new ChangeSet();
       var unreachableAssets = new Set.from(sources.keys).difference(visited);
       for (var unreachable in unreachableAssets) {
-        changeSet.removed(sources[unreachable]);
+        changeSet.removedSource(sources[unreachable]);
         sources.remove(unreachable);
       }
 
@@ -287,9 +287,9 @@
     _dependentAssets = null;
 
     if (added) {
-      _resolver._context.applyChanges(new ChangeSet()..added(this));
+      _resolver._context.applyChanges(new ChangeSet()..addedSource(this));
     } else {
-      _resolver._context.applyChanges(new ChangeSet()..changed(this));
+      _resolver._context.applyChanges(new ChangeSet()..changedSource(this));
     }
 
     var compilationUnit = _resolver._context.parseCompilationUnit(this);
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index ad730ea..509fae8 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -4,7 +4,7 @@
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
-  analyzer: "0.13.0-dev.3"
+  analyzer: "0.13.0-dev.4"
   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/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index cd7c797..3b5784c 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -723,7 +723,7 @@
     }
     else {
       var processResult = Process.runSync('git', ['clone', '-b', 'master',
-          'git://github.com/dart-lang/dartdoc-viewer.git'],
+          'https://github.com/dart-lang/dartdoc-viewer.git'],
           runInShell: true);
 
       if (processResult.exitCode == 0) {
@@ -750,6 +750,36 @@
     }
   }
 
+  /// Move the generated json/yaml docs directory to the dartdoc-viewer
+  /// directory, to run as a webpage.
+  static void _moveDirectoryAndServe() {
+    var processResult = Process.runSync(_Generator._pubScript, ['upgrade'],
+        runInShell: true, workingDirectory: path.join(_dartdocViewerDir.path,
+        'client'));
+    print('process output: ${processResult.stdout}');
+    print('process stderr: ${processResult.stderr}');
+
+    var dir = new Directory(_Generator._outputDirectory == null? 'docs' :
+        _Generator._outputDirectory);
+    var webDocsDir = new Directory(path.join(_dartdocViewerDir.path, 'client',
+        'web', 'docs'));
+    if (dir.existsSync()) {
+      // Move the docs folder to dartdoc-viewer/client/web/docs
+      dir.renameSync(webDocsDir.path);
+    }
+
+    if (webDocsDir.existsSync()) {
+      // Compile the code to JavaScript so we can run on any browser.
+      print('Compile app to JavaScript for viewing.');
+      var processResult = Process.runSync(_Generator._dartBinary,
+          ['deploy.dart'], workingDirectory : path.join(_dartdocViewerDir.path,
+          'client'), runInShell: true);
+      print('process output: ${processResult.stdout}');
+      print('process stderr: ${processResult.stderr}');
+      _runServer();
+    }
+  }
+
   static void _compile() {
     if (_webDocsDir.existsSync()) {
       // Compile the code to JavaScript so we can run on any browser.
@@ -989,13 +1019,19 @@
   /// Creates a [Map] with this [Indexable]'s name and a preview comment.
   Map get previewMap {
     var finalMap = { 'name' : name, 'qualifiedName' : qualifiedName };
+    var preview = _preview;
+    if(preview != null) finalMap['preview'] = preview;
+    return finalMap;
+  }
+
+  String get _preview {
     if (comment != '') {
       var index = comment.indexOf('</p>');
-      finalMap['preview'] = index > 0 ?
+      return index > 0 ?
           '${comment.substring(0, index)}</p>' :
           '<p><i>Comment preview not available</i></p>';
     }
-    return finalMap;
+    return null;
   }
 
   /// Accessor to obtain the raw comment text for a given item, _without_ any
@@ -1918,15 +1954,24 @@
     annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
   }
 
-  Map toMap() => {
-    'name': name,
-    'qualifiedName': qualifiedName,
-    'comment': comment,
-    'return': returnType,
-    'parameters': recurseMap(parameters),
-    'annotations': annotations.map((a) => a.toMap()).toList(),
-    'generics': recurseMap(generics)
-  };
+  Map toMap() {
+    var map = {
+      'name': name,
+      'qualifiedName': qualifiedName,
+      'comment': comment,
+      'return': returnType,
+      'parameters': recurseMap(parameters),
+      'annotations': annotations.map((a) => a.toMap()).toList(),
+      'generics': recurseMap(generics)
+    };
+
+    // Typedef is displayed on the library page as a class, so a preview is
+    // added manually
+    var preview = _preview;
+    if(preview != null) map['preview'] = preview;
+
+    return map;
+  }
 
   markdown.Node fixReference(String name) => null;
 
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index 78554ae..77291e7 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -8,12 +8,9 @@
 dependencies:
   args: '>=0.9.0 <0.11.0'
   logging: '>=0.9.0 <0.10.0'
-  markdown:
-    git:
-      ref: emilysEdits
-      url: https://github.com/efortuna/dart-markdown
+  markdown: '0.5.1'
   path: '>=0.9.0 <2.0.0'
   yaml: '>=0.9.0 <0.10.0'
 dev_dependencies:
-  scheduled_test: '>=0.9.3 <0.10.0'
+  scheduled_test: '>=0.10.0 <0.11.0'
   unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
index 522758c..f158dab 100644
--- a/pkg/docgen/test/generate_json_test.dart
+++ b/pkg/docgen/test/generate_json_test.dart
@@ -4,6 +4,7 @@
 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;
@@ -49,6 +50,41 @@
     ]).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) {
diff --git a/pkg/docgen/test/multi_library_code/lib/temp3.dart b/pkg/docgen/test/multi_library_code/lib/temp3.dart
index 01137e7..fa1d74a 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp3.dart
+++ b/pkg/docgen/test/multi_library_code/lib/temp3.dart
@@ -7,7 +7,7 @@
 class C {
 }
 
-// A trivial use of `A` to eliminate import warnings
-A usingImport() {
-  throw new UnimplementedError();
-}
+/// A trivial use of `A` to eliminate import warnings.
+///
+/// And to test typedef preview.
+typedef A AnATransformer(A input);
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 1bc9b0f..dfaed73 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -5,7 +5,7 @@
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/intl
 dependencies:
-  analyzer: "0.13.0-dev.3"
+  analyzer: "0.13.0-dev.4"
   path: ">=0.9.0 <2.0.0"
 dev_dependencies:
   serialization: ">=0.9.0 <0.10.0"
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index 74ee771..c3dad6e 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -1,14 +1,14 @@
 name: oauth2
-version: 0.9.1
-author: "Dart Team <misc@dartlang.org>"
+version: 0.9.2-dev
+author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
   A client library for authenticating with a remote service via OAuth2 on
   behalf of a user, and making authorized HTTP requests with the user's
   OAuth2 credentials. Currently only works with dart:io.
-dependencies:
-  http: ">=0.9.2 <0.10.0"
-dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: '>=1.0.0 <2.0.0'
+dependencies:
+  http: '>=0.9.2 <0.10.0'
+dev_dependencies:
+  unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/oauth2/test/authorization_code_grant_test.dart b/pkg/oauth2/test/authorization_code_grant_test.dart
index 85c54e7..2c3265e 100644
--- a/pkg/oauth2/test/authorization_code_grant_test.dart
+++ b/pkg/oauth2/test/authorization_code_grant_test.dart
@@ -29,12 +29,6 @@
       httpClient: client);
 }
 
-void expectFutureThrows(future, predicate) {
-  future.catchError(expectAsync1((error) {
-    expect(predicate(error), isTrue);
-  }));
-}
-
 void main() {
   group('.getAuthorizationUrl', () {
     setUp(createGrant);
@@ -96,46 +90,41 @@
     setUp(createGrant);
 
     test("can't be called before .getAuthorizationUrl", () {
-      expectFutureThrows(grant.handleAuthorizationResponse({}),
-                         (e) => e is StateError);
+      expect(grant.handleAuthorizationResponse({}), throwsStateError);
     });
 
     test("can't be called twice", () {
       grant.getAuthorizationUrl(redirectUrl);
-      expectFutureThrows(
-          grant.handleAuthorizationResponse({'code': 'auth code'}),
-          (e) => e is FormatException);
-      expectFutureThrows(
-          grant.handleAuthorizationResponse({'code': 'auth code'}),
-          (e) => e is StateError);
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'}),
+          throwsFormatException);
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'}),
+          throwsStateError);
     });
 
     test('must have a state parameter if the authorization URL did', () {
       grant.getAuthorizationUrl(redirectUrl, state: 'state');
-      expectFutureThrows(
-          grant.handleAuthorizationResponse({'code': 'auth code'}),
-          (e) => e is FormatException);
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'}),
+          throwsFormatException);
     });
 
     test('must have the same state parameter the authorization URL did', () {
       grant.getAuthorizationUrl(redirectUrl, state: 'state');
-      expectFutureThrows(grant.handleAuthorizationResponse({
+      expect(grant.handleAuthorizationResponse({
         'code': 'auth code',
         'state': 'other state'
-      }), (e) => e is FormatException);
+      }), throwsFormatException);
     });
 
     test('must have a code parameter', () {
       grant.getAuthorizationUrl(redirectUrl);
-      expectFutureThrows(grant.handleAuthorizationResponse({}),
-                         (e) => e is FormatException);
+      expect(grant.handleAuthorizationResponse({}), throwsFormatException);
     });
 
     test('with an error parameter throws an AuthorizationException', () {
       grant.getAuthorizationUrl(redirectUrl);
-      expectFutureThrows(
+      expect(
           grant.handleAuthorizationResponse({'error': 'invalid_request'}),
-          (e) => e is oauth2.AuthorizationException);
+          throwsA((e) => e is oauth2.AuthorizationException));
     });
 
     test('sends an authorization code request', () {
@@ -157,10 +146,9 @@
         }), 200, headers: {'content-type': 'application/json'}));
       });
 
-      grant.handleAuthorizationResponse({'code': 'auth code'})
-          .then(expectAsync1((client) {
-            expect(client.credentials.accessToken, equals('access token'));
-          }));
+      expect(grant.handleAuthorizationResponse({'code': 'auth code'})
+            .then((client) => client.credentials.accessToken),
+          completion(equals('access token')));
     });
   });
 
@@ -168,18 +156,13 @@
     setUp(createGrant);
 
     test("can't be called before .getAuthorizationUrl", () {
-      expectFutureThrows(
-          grant.handleAuthorizationCode('auth code'),
-          (e) => e is StateError);
+      expect(grant.handleAuthorizationCode('auth code'), throwsStateError);
     });
 
     test("can't be called twice", () {
       grant.getAuthorizationUrl(redirectUrl);
-      expectFutureThrows(
-          grant.handleAuthorizationCode('auth code'),
-          (e) => e is FormatException);
-      expectFutureThrows(grant.handleAuthorizationCode('auth code'),
-                         (e) => e is StateError);
+      expect(grant.handleAuthorizationCode('auth code'), throwsFormatException);
+      expect(grant.handleAuthorizationCode('auth code'), throwsStateError);
     });
 
     test('sends an authorization code request', () {
diff --git a/pkg/oauth2/test/client_test.dart b/pkg/oauth2/test/client_test.dart
index 56dd789..ad552c0 100644
--- a/pkg/oauth2/test/client_test.dart
+++ b/pkg/oauth2/test/client_test.dart
@@ -81,8 +81,7 @@
       httpClient.expectRequest((request) {
         expect(request.method, equals('GET'));
         expect(request.url.toString(), equals(requestUri.toString()));
-        expect(request.headers['authorization'],
-            equals('Bearer access token'));
+        expect(request.headers['authorization'], equals('Bearer access token'));
 
         return new Future.value(new http.Response('good job', 200));
       });
@@ -130,8 +129,7 @@
       httpClient.expectRequest((request) {
         expect(request.method, equals('GET'));
         expect(request.url.toString(), equals(requestUri.toString()));
-        expect(request.headers['authorization'],
-            equals('Bearer access token'));
+        expect(request.headers['authorization'], equals('Bearer access token'));
 
         var authenticate = 'Bearer error="invalid_token", error_description='
             '"Something is terribly wrong."';
diff --git a/pkg/oauth2/test/credentials_test.dart b/pkg/oauth2/test/credentials_test.dart
index f3e303b..2ce9ec4 100644
--- a/pkg/oauth2/test/credentials_test.dart
+++ b/pkg/oauth2/test/credentials_test.dart
@@ -43,19 +43,17 @@
     var credentials = new oauth2.Credentials(
         'access token', null, tokenEndpoint);
     expect(credentials.canRefresh, false);
-    credentials.refresh('identifier', 'secret', httpClient: httpClient)
-        .catchError(expectAsync1((error) {
-          expect(error is StateError, isTrue);
-        }));
+
+    expect(credentials.refresh('identifier', 'secret', httpClient: httpClient),
+        throwsStateError);
   });
 
   test("can't refresh without a token endpoint", () {
     var credentials = new oauth2.Credentials('access token', 'refresh token');
     expect(credentials.canRefresh, false);
-    credentials.refresh('identifier', 'secret', httpClient: httpClient)
-        .catchError(expectAsync1((error) {
-          expect(error is StateError, isTrue);
-        }));
+
+    expect(credentials.refresh('identifier', 'secret', httpClient: httpClient),
+        throwsStateError);
   });
 
   test("can refresh with a refresh token and a token endpoint", () {
diff --git a/pkg/oauth2/test/handle_access_token_response_test.dart b/pkg/oauth2/test/handle_access_token_response_test.dart
index c362868..d97ef38 100644
--- a/pkg/oauth2/test/handle_access_token_response_test.dart
+++ b/pkg/oauth2/test/handle_access_token_response_test.dart
@@ -38,8 +38,7 @@
     });
 
     test('with an unexpected code causes a FormatException', () {
-      expect(() => handleError(statusCode: 500),
-          throwsFormatException);
+      expect(() => handleError(statusCode: 500), throwsFormatException);
     });
 
     test('with no content-type causes a FormatException', () {
@@ -60,13 +59,11 @@
     });
 
     test('with invalid JSON causes a FormatException', () {
-      expect(() => handleError(body: 'not json'),
-          throwsFormatException);
+      expect(() => handleError(body: 'not json'), throwsFormatException);
     });
 
     test('with a non-string error causes a FormatException', () {
-      expect(() => handleError(body: '{"error": 12}'),
-          throwsFormatException);
+      expect(() => handleError(body: '{"error": 12}'), throwsFormatException);
     });
 
     test('with a non-string error_description causes a FormatException', () {
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 646027e..460e1b8 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -9,7 +9,7 @@
   user input into the DOM is immediately assigned to the model.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.3"
+  analyzer: "0.13.0-dev.4"
   barback: ">=0.9.0 <0.13.0"
   logging: ">=0.9.0 <0.10.0"
   path: ">=0.9.0 <2.0.0"
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 2399637..00290a7 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -65,6 +65,7 @@
 polymer/test/event_path_test: Skip #uses dart:html
 polymer/test/events_test: Skip #uses dart:html
 polymer/test/instance_attrs_test: Skip #uses dart:html
+polymer/test/js_interop_test: Skip #uses dart:html
 polymer/test/nested_binding_test: Skip # uses dart:html
 polymer/test/noscript_test: Skip #uses dart:html
 polymer/test/prop_attr_bind_reflection_test: Skip #uses dart:html
@@ -150,6 +151,8 @@
 
 [ $compiler == dart2js && $csp ]
 unittest/test/mirror_matchers_test: Skip # Issue 12151
+polymer/test/noscript_test: Fail # Issue 17326
+polymer/test/js_interop_test: Fail # Issue 17326
 
 # This test cannot run under CSP because it is injecting a JavaScript polyfill
 mutation_observer: Skip
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index c73abe9..c8932a9 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -15,10 +15,7 @@
 pkg/browser: PubGetError
 
 [ $use_public_packages ]
-pkg/template_binding: Pass, PubGetError # Issue 16026
-pkg/polymer: Pass, PubGetError # Issue 16026
-pkg/polymer_expressions: Pass, PubGetError # Issue 16026
-pkg/observe: Pass, PubGetError # Issue 16026
+samples/third_party/todomvc: Fail # Issue 17324
 
 [ $builder_tag == russian ]
 samples/third_party/pop-pop-win: Fail # Issue 16356
diff --git a/pkg/polymer/.bowerrc b/pkg/polymer/.bowerrc
deleted file mode 100644
index fea0afb..0000000
--- a/pkg/polymer/.bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "directory" : "lib/elements/"
-}
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index c53ea4cc..a3a44ba 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -6,9 +6,12 @@
 and template_binding.
 
 #### Pub version 0.10.0-dev
+  * Interop with polymer-js elements now works.
   * Polymer polyfills are now consolidated in package:web_components, which is
-    identical to platform.js from http://polymer-project.org. This enables
-    interop with elements built in polymer.js.
+    identical to platform.js from http://polymer-project.org.
+  * Breaking change: "noscript" polymer-elements are created by polymer.js, and
+    therefore cannot be extended (subtyped) in Dart. They can still be used
+    by Dart elements or applications, however.
   * New feature: `@ObserveProperty('foo bar.baz') myMethod() {...}` will cause
     myMethod to be called when "foo" or "bar.baz" changes.
   * Updated for 0.10.0-dev package:observe and package:template_binding changes.
diff --git a/pkg/polymer/bower.json b/pkg/polymer/bower.json
deleted file mode 100644
index 8ed61c6..0000000
--- a/pkg/polymer/bower.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "name": "polymer-dart",
-  "authors": [
-    "Polymer.dart Authors <web-ui-dev@dartlang.org>"
-  ],
-  "dependencies": {
-    "polymer-elements": "Polymer/polymer-elements#master",
-    "polymer-ui-elements": "Polymer/polymer-ui-elements#master"
-  },
-  "license": "BSD",
-  "private": true
-}
diff --git a/pkg/polymer/example/canonicalization/test/deploy2_test.html b/pkg/polymer/example/canonicalization/test/deploy2_test.html
index ec45f51..a2884b7 100644
--- a/pkg/polymer/example/canonicalization/test/deploy2_test.html
+++ b/pkg/polymer/example/canonicalization/test/deploy2_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to deploy_test, but 'e' imports 'b' -->
     <link rel="import" href="packages/canonicalization/e.html">
diff --git a/pkg/polymer/example/canonicalization/test/deploy3_test.html b/pkg/polymer/example/canonicalization/test/deploy3_test.html
index 80470b9..a15ed4c 100644
--- a/pkg/polymer/example/canonicalization/test/deploy3_test.html
+++ b/pkg/polymer/example/canonicalization/test/deploy3_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to deploy_test, but 'f' imports 'b' -->
     <link rel="import" href="packages/canonicalization/f.html">
diff --git a/pkg/polymer/example/canonicalization/test/deploy_test.html b/pkg/polymer/example/canonicalization/test/deploy_test.html
index 112f400..8ac6ec0 100644
--- a/pkg/polymer/example/canonicalization/test/deploy_test.html
+++ b/pkg/polymer/example/canonicalization/test/deploy_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/dev2_test.html b/pkg/polymer/example/canonicalization/test/dev2_test.html
index 177116d..18ce024 100644
--- a/pkg/polymer/example/canonicalization/test/dev2_test.html
+++ b/pkg/polymer/example/canonicalization/test/dev2_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to dev_test, but 'e' imports 'b' -->
     <link rel="import" href="packages/canonicalization/e.html">
diff --git a/pkg/polymer/example/canonicalization/test/dev3_test.html b/pkg/polymer/example/canonicalization/test/dev3_test.html
index c77ee28..f30a992 100644
--- a/pkg/polymer/example/canonicalization/test/dev3_test.html
+++ b/pkg/polymer/example/canonicalization/test/dev3_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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/f.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/dev_test.html b/pkg/polymer/example/canonicalization/test/dev_test.html
index 75b7df6..d145f9e 100644
--- a/pkg/polymer/example/canonicalization/test/dev_test.html
+++ b/pkg/polymer/example/canonicalization/test/dev_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
     <link rel="import" href="packages/canonicalization/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/dir/deploy2_test.html b/pkg/polymer/example/canonicalization/test/dir/deploy2_test.html
index 8c75ad9..f2646b4 100644
--- a/pkg/polymer/example/canonicalization/test/dir/deploy2_test.html
+++ b/pkg/polymer/example/canonicalization/test/dir/deploy2_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/dir/deploy_test.html b/pkg/polymer/example/canonicalization/test/dir/deploy_test.html
index 112f400..8ac6ec0 100644
--- a/pkg/polymer/example/canonicalization/test/dir/deploy_test.html
+++ b/pkg/polymer/example/canonicalization/test/dir/deploy_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dev2_test.html b/pkg/polymer/example/canonicalization/test/dir/dev2_test.html
index aebe32b..4c5306f 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dev2_test.html
+++ b/pkg/polymer/example/canonicalization/test/dir/dev2_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="../packages/canonicalization/a.html">
     <link rel="import" href="../packages/canonicalization/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dev_test.html b/pkg/polymer/example/canonicalization/test/dir/dev_test.html
index 75b7df6..d145f9e 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dev_test.html
+++ b/pkg/polymer/example/canonicalization/test/dir/dev_test.html
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
     <link rel="import" href="packages/canonicalization/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
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 4d47f9f..4db4438 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
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
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 7794c2a..a5c2d28 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
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
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 4d47f9f..4db4438 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
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
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 7794c2a..a5c2d28 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
@@ -8,6 +8,7 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <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">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/component/news/test/news_index_test.html b/pkg/polymer/example/component/news/test/news_index_test.html
index cc0b98d..1f5ded0 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.html
+++ b/pkg/polymer/example/component/news/test/news_index_test.html
@@ -7,6 +7,7 @@
 <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <title>Simple Web Components Example</title>
+  <link rel="import" href="packages/polymer/polymer.html">
   <link rel="import" href="../web/news-component.html">
   <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
 </head>
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index 6f6847e..fa1c0f7 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -37,17 +37,37 @@
 /// Tips for converting your apps from Web UI to Polymer.dart.
 library polymer;
 
+// Last ported from:
+// https://github.com/Polymer/polymer-dev/tree/37eea00e13b9f86ab21c85a955585e8e4237e3d2
+// TODO(jmesserly): we need to do a redundancy check. Some code like the FOUC
+// protection seems out of date, as if left over from the older
+// b7200854b2441a22ce89f6563963f36c50f5150d baseline.
+
 import 'dart:async';
 import 'dart:collection' show HashMap, HashSet;
 import 'dart:html';
-import 'dart:js' as js;
+import 'dart:js' as js show context;
+import 'dart:js' hide context;
 
+// *** Important Note ***
+// This import is automatically replaced when calling pub build by the
+// mirrors_remover transformer. The transformer will remove any dependencies on
+// dart:mirrors in deployed polymer apps. This and the import to
+// mirror_loader.dart below should be updated in sync with changed in
+// lib/src/build/mirrors_remover.dart.
+//
+// Technically, if we have codegen for expressions we shouldn't need any
+// @MirrorsUsed (since this is for development only), but our test bots don't
+// run pub-build yet. Until then, polymer might be tested with mirror_loader
+// instead of the static_loader, however the actual code there is practically
+// dead ([initializers] will be set programatically with generated code
+// anyways), but the @MirrorsUsed helps reduce the load on our bots.
 @MirrorsUsed(metaTargets:
     const [Reflectable, ObservableProperty, PublishedProperty, CustomTag,
-        _InitMethodAnnotation],
-    targets: const [PublishedProperty],
-    override: const ['smoke.mirrors', 'polymer'])
-import 'dart:mirrors';
+        ObserveProperty],
+    targets: const [PublishedProperty, ObserveProperty],
+    override: const ['smoke.mirrors'])
+import 'dart:mirrors' show MirrorsUsed;    // ** see important note above
 
 import 'package:logging/logging.dart' show Logger, Level;
 import 'package:observe/observe.dart';
@@ -61,11 +81,11 @@
 import 'package:web_components/polyfill.dart' show customElementsReady;
 
 import 'deserialize.dart' as deserialize;
+import 'src/mirror_loader.dart' as loader; // ** see important note above
 
 export 'package:observe/observe.dart';
 export 'package:observe/html.dart';
 
-part 'src/boot.dart';
 part 'src/declaration.dart';
 part 'src/instance.dart';
 part 'src/job.dart';
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
new file mode 100644
index 0000000..9a90ea1
--- /dev/null
+++ b/pkg/polymer/lib/polymer.html
@@ -0,0 +1,26 @@
+<!--
+ Copyright 2013 The Polymer Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file.
+-->
+
+<script src="src/js/use_native_dartium_shadowdom.js"></script>
+
+<!--
+These two files are from the Polymer project:
+https://github.com/Polymer/platform/ and https://github.com/Polymer/polymer/.
+
+You can replace platform.js and polymer.html with different versions if desired.
+-->
+<!-- minified for deployment: -->
+<script src="../../packages/web_components/platform.js"></script>
+<link rel="import" href="src/js/polymer/polymer.html">
+
+<!-- unminfied for debugging:
+<script src="../../packages/web_components/platform.concat.js"></script>
+<script src="src/js/polymer/polymer.concat.js"></script>
+<link rel="import" href="src/js/polymer/polymer-body.html">
+-->
+
+<!-- Teach dart2js about Shadow DOM polyfill objects. -->
+<script src="../../packages/web_components/dart_support.js"></script>
diff --git a/pkg/polymer/lib/src/boot.dart b/pkg/polymer/lib/src/boot.dart
deleted file mode 100644
index 0bad65f..0000000
--- a/pkg/polymer/lib/src/boot.dart
+++ /dev/null
@@ -1,42 +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.
-
-/// Ported from `polymer/src/boot.js`. *
-part of polymer;
-
-/// Prevent a flash of unstyled content.
-_preventFlashOfUnstyledContent() {
-
-  var style = new StyleElement();
-  style.text = '.$_VEILED_CLASS { '
-      'opacity: 0; } \n'
-      '.$_UNVEIL_CLASS{ '
-      '-webkit-transition: opacity ${_TRANSITION_TIME}s; '
-      'transition: opacity ${_TRANSITION_TIME}s; }\n';
-
-  // Note: we use `query` and not `document.head` to make sure this code works
-  // with the shadow_dom polyfill (a limitation of the polyfill is that it can't
-  // override the definitions of document, document.head, or document.body).
-  var head = document.querySelector('head');
-  head.insertBefore(style, head.firstChild);
-
-  _veilElements();
-
-  // hookup auto-unveiling
-  Polymer.onReady.then((_) => Polymer.unveilElements());
-}
-
-// add polymer styles
-const _VEILED_CLASS = 'polymer-veiled';
-const _UNVEIL_CLASS = 'polymer-unveil';
-const _TRANSITION_TIME = 0.3;
-
-// apply veiled class
-_veilElements() {
-  for (var selector in Polymer.veiledElements) {
-    for (var node in document.querySelectorAll(selector)) {
-      node.classes.add(_VEILED_CLASS);
-    }
-  }
-}
diff --git a/pkg/polymer/lib/src/build/mirrors_remover.dart b/pkg/polymer/lib/src/build/mirrors_remover.dart
new file mode 100644
index 0000000..5c58c39
--- /dev/null
+++ b/pkg/polymer/lib/src/build/mirrors_remover.dart
@@ -0,0 +1,48 @@
+// 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.
+
+/// Transformer that removes uses of mirrors from the polymer runtime, so that
+/// deployed applications are thin and small.
+library polymer.src.build.mirrors_remover;
+
+import 'dart:async';
+import 'package:barback/barback.dart';
+
+/// Removes the code-initialization logic based on mirrors.
+class MirrorsRemover extends Transformer {
+  MirrorsRemover.asPlugin();
+
+  /// Only apply to `lib/polymer.dart`.
+  Future<bool> isPrimary(Asset input) => new Future.value(
+      input.id.package == 'polymer' &&
+      input.id.path == 'lib/polymer.dart');
+
+  Future apply(Transform transform) {
+    var id = transform.primaryInput.id;
+    return transform.primaryInput.readAsString().then((code) {
+      // Note: this rewrite is highly-coupled with how polymer.dart is
+      // written. Make sure both are updated in sync.
+      var start = code.indexOf('@MirrorsUsed');
+      if (start == -1) _error();
+      var end = code.indexOf('show MirrorsUsed;', start);
+      if (end == -1) _error();
+      var loaderImport = code.indexOf(
+          "import 'src/mirror_loader.dart' as loader;", end);
+      if (loaderImport == -1) _error();
+      var sb = new StringBuffer()
+          ..write(code.substring(0, start))
+          ..write(code.susbtring(end)
+              .replaceAll('src/mirror_loader.dart', 'src/static_loader.dart'));
+
+      transform.addOutput(new Asset.fromString(id, sb.toString()));
+    });
+  }
+}
+
+/** Transformer phases which should be applied to the smoke package. */
+List<List<Transformer>> get phasesForSmoke =>
+    [[new MirrorsRemover.asPlugin()]];
+
+_error() => throw new StateError("Couldn't remove imports to mirrors, maybe "
+    "polymer.dart was modified, but mirrors_remover.dart wasn't.");
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 9f26e22..fe85e8f 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -8,6 +8,7 @@
 import 'dart:async';
 import 'dart:convert';
 
+import 'package:html5lib/dom.dart' show Document, Element;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
@@ -26,7 +27,7 @@
 /// Internally, this transformer will convert each script tag into an import
 /// statement to a library, and then uses `initPolymer` (see polymer.dart)  to
 /// process `@initMethod` and `@CustomTag` annotations in those libraries.
-class ScriptCompactor extends Transformer with PolymerTransformer {
+class ScriptCompactor extends Transformer {
   final TransformOptions options;
 
   ScriptCompactor(this.options);
@@ -35,95 +36,134 @@
   Future<bool> isPrimary(Asset input) =>
       new Future.value(options.isHtmlEntryPoint(input.id));
 
-  Future apply(Transform transform) {
-    var id = transform.primaryInput.id;
-    var secondaryId = id.addExtension('.scriptUrls');
-    var logger = transform.logger;
-    return readPrimaryAsHtml(transform).then((document) {
-      return transform.readInputAsString(secondaryId).then((libraryIds) {
-        var libraries = (JSON.decode(libraryIds) as Iterable).map(
-          (data) => new AssetId.deserialize(data)).toList();
-        var mainLibraryId;
-        var mainScriptTag;
-        bool changed = false;
+  Future apply(Transform transform) =>
+      new _ScriptCompactor(transform, options).apply();
+}
 
-        for (var tag in document.querySelectorAll('script')) {
-          var src = tag.attributes['src'];
-          if (src == 'packages/polymer/boot.js') {
-            tag.remove();
-            continue;
-          }
-          if (tag.attributes['type'] != 'application/dart') continue;
-          if (src == null) {
-            logger.warning('unexpected script without a src url. The '
-              'ScriptCompactor transformer should run after running the '
-              'InlineCodeExtractor', span: tag.sourceSpan);
-            continue;
-          }
-          if (mainLibraryId != null) {
-            logger.warning('unexpected script. Only one Dart script tag '
-              'per document is allowed.', span: tag.sourceSpan);
-            tag.remove();
-            continue;
-          }
-          mainLibraryId = resolve(id, src, logger, tag.sourceSpan);
-          mainScriptTag = tag;
-        }
+/// Helper class mainly use to flatten the async code.
+class _ScriptCompactor extends PolymerTransformer {
+  final TransformOptions options;
+  final Transform transform;
+  final TransformLogger logger;
+  final AssetId docId;
+  final AssetId bootstrapId;
 
-        if (mainScriptTag == null) {
-          // We didn't find any main library, nothing to do.
-          transform.addOutput(transform.primaryInput);
-          return null;
-        }
+  Document document;
+  List<AssetId> entryLibraries;
+  AssetId mainLibraryId;
+  Element mainScriptTag;
+  final Map<AssetId, List<_Initializer>> initializers = {};
 
-        // Emit the bootstrap .dart file
-        var bootstrapId = id.addExtension('_bootstrap.dart');
-        mainScriptTag.attributes['src'] =
-            path.url.basename(bootstrapId.path);
+  _ScriptCompactor(Transform transform, this.options)
+      : transform = transform,
+        logger = transform.logger,
+        docId = transform.primaryInput.id,
+        bootstrapId = transform.primaryInput.id.addExtension('_bootstrap.dart');
 
-        libraries.add(mainLibraryId);
-        var urls = libraries.map((id) => assetUrlFor(id, bootstrapId, logger))
-            .where((url) => url != null).toList();
-        var buffer = new StringBuffer()..writeln(MAIN_HEADER);
-        int i = 0;
-        for (; i < urls.length; i++) {
-          buffer.writeln("import '${urls[i]}' as i$i;");
-        }
+  Future apply() =>
+      _loadDocument()
+      .then(_loadEntryLibraries)
+      .then(_processHtml)
+      .then(_emitNewEntrypoint);
 
-        buffer..write('\n')
-            ..writeln('void main() {')
-            ..writeln('  configureForDeployment([');
+  /// Loads the primary input as an html document.
+  Future _loadDocument() =>
+      readPrimaryAsHtml(transform).then((doc) { document = doc; });
 
-        // Inject @CustomTag and @initMethod initializations for each library
-        // that is sourced in a script tag.
-        i = 0;
-        return Future.forEach(libraries, (lib) {
-          return _initializersOf(lib, transform, logger).then((initializers) {
-            for (var init in initializers) {
-              var code = init.asCode('i$i');
-              buffer.write("      $code,\n");
-            }
-            i++;
-          });
-        }).then((_) {
-          buffer..writeln('    ]);')
-              ..writeln('  i${urls.length - 1}.main();')
-              ..writeln('}');
-
-          transform.addOutput(new Asset.fromString(
-                bootstrapId, buffer.toString()));
-          transform.addOutput(new Asset.fromString(id, document.outerHtml));
-        });
+  /// Populates [entryLibraries] as a list containing the asset ids of each
+  /// library loaded on a script tag. The actual work of computing this is done
+  /// in an earlier phase and emited in the `entrypoint.scriptUrls` asset.
+  Future _loadEntryLibraries(_) =>
+      transform.readInputAsString(docId.addExtension('.scriptUrls'))
+          .then((libraryIds) {
+        entryLibraries = (JSON.decode(libraryIds) as Iterable)
+            .map((data) => new AssetId.deserialize(data)).toList();
       });
+
+  /// Removes unnecessary script tags, and identifies the main entry point Dart
+  /// script tag (if any).
+  void _processHtml(_) {
+    for (var tag in document.querySelectorAll('script')) {
+      var src = tag.attributes['src'];
+      if (src == 'packages/polymer/boot.js') {
+        tag.remove();
+        continue;
+      }
+      if (tag.attributes['type'] != 'application/dart') continue;
+      if (src == null) {
+        logger.warning('unexpected script without a src url. The '
+          'ScriptCompactor transformer should run after running the '
+          'InlineCodeExtractor', span: tag.sourceSpan);
+        continue;
+      }
+      if (mainLibraryId != null) {
+        logger.warning('unexpected script. Only one Dart script tag '
+          'per document is allowed.', span: tag.sourceSpan);
+        tag.remove();
+        continue;
+      }
+      mainLibraryId = resolve(docId, src, logger, tag.sourceSpan);
+      mainScriptTag = tag;
+    }
+  }
+
+  /// Emits the main HTML and Dart bootstrap code for the application. If there
+  /// were not Dart entry point files, then this simply emits the original HTML.
+  Future _emitNewEntrypoint(_) {
+    if (mainScriptTag == null) {
+      // We didn't find any main library, nothing to do.
+      transform.addOutput(transform.primaryInput);
+      return null;
+    }
+
+    // Emit the bootstrap .dart file
+    mainScriptTag.attributes['src'] = path.url.basename(bootstrapId.path);
+    entryLibraries.add(mainLibraryId);
+    return _computeInitializers().then(_createBootstrapCode).then((code) {
+      transform.addOutput(new Asset.fromString(bootstrapId, code));
+      transform.addOutput(new Asset.fromString(docId, document.outerHtml));
     });
   }
 
+  /// Emits the actual bootstrap code.
+  String _createBootstrapCode(_) {
+    StringBuffer code = new StringBuffer()..writeln(MAIN_HEADER);
+    for (int i = 0; i < entryLibraries.length; i++) {
+      var url = assetUrlFor(entryLibraries[i], bootstrapId, logger);
+      if (url != null) code.writeln("import '$url' as i$i;");
+    }
+
+    code..write('\n')
+        ..writeln('void main() {')
+        ..writeln('  configureForDeployment([');
+
+    // Inject @CustomTag and @initMethod initializations for each library
+    // that is sourced in a script tag.
+    for (int i = 0; i < entryLibraries.length; i++) {
+      for (var init in initializers[entryLibraries[i]]) {
+        var initCode = init.asCode('i$i');
+        code.write("      $initCode,\n");
+      }
+    }
+    code..writeln('    ]);')
+        ..writeln('  i${entryLibraries.length - 1}.main();')
+        ..writeln('}');
+    return code.toString();
+  }
+
+  /// Computes initializers needed for each library in [entryLibraries]. Results
+  /// are available afterwards in [initializers].
+  Future _computeInitializers() => Future.forEach(entryLibraries, (lib) {
+      return _initializersOf(lib).then((res) {
+        initializers[lib] = res;
+      });
+    });
+
   /// Computes the initializers of [dartLibrary]. That is, a closure that calls
   /// Polymer.register for each @CustomTag, and any public top-level methods
   /// labeled with @initMethod.
-  Future<List<_Initializer>> _initializersOf(
-      AssetId dartLibrary, Transform transform, TransformLogger logger) {
-    var initializers = [];
+  Future<List<_Initializer>> _initializersOf(AssetId dartLibrary) {
+    var result = [];
     return transform.readInputAsString(dartLibrary).then((code) {
       var file = new SourceFile.text(_simpleUriForSource(dartLibrary), code);
       var unit = parseCompilationUnit(code);
@@ -133,8 +173,7 @@
         if (directive is PartDirective) {
           var targetId = resolve(dartLibrary, directive.uri.stringValue,
               logger, _getSpan(file, directive));
-          return _initializersOf(targetId, transform, logger)
-              .then(initializers.addAll);
+          return _initializersOf(targetId).then(result.addAll);
         }
 
         // Similarly, include anything from exports except what's filtered by
@@ -142,20 +181,20 @@
         if (directive is ExportDirective) {
           var targetId = resolve(dartLibrary, directive.uri.stringValue,
               logger, _getSpan(file, directive));
-          return _initializersOf(targetId, transform, logger)
-              .then((r) => _processExportDirective(directive, r, initializers));
+          return _initializersOf(targetId).then(
+            (r) => _processExportDirective(directive, r, result));
         }
       }).then((_) {
         // Scan the code for classes and top-level functions.
         for (var node in unit.declarations) {
           if (node is ClassDeclaration) {
-            _processClassDeclaration(node, initializers, file, logger);
+            _processClassDeclaration(node, result, file, logger);
           } else if (node is FunctionDeclaration &&
               node.metadata.any(_isInitMethodAnnotation)) {
-            _processFunctionDeclaration(node, initializers, file, logger);
+            _processFunctionDeclaration(node, result, file, logger);
           }
         }
-        return initializers;
+        return result;
       });
     });
   }
@@ -165,11 +204,11 @@
       ? 'package:${source.package}/${source.path.substring(4)}' : source.path;
 
   /// Filter [exportedInitializers] according to [directive]'s show/hide
-  /// combinators and add the result to [initializers].
+  /// combinators and add the result to [result].
   // TODO(sigmund): call the analyzer's resolver instead?
   static _processExportDirective(ExportDirective directive,
       List<_Initializer> exportedInitializers,
-      List<_Initializer> initializers) {
+      List<_Initializer> result) {
     for (var combinator in directive.combinators) {
       if (combinator is ShowCombinator) {
         var show = combinator.shownNames.map((n) => n.name).toSet();
@@ -179,13 +218,13 @@
         exportedInitializers.removeWhere((e) => hide.contains(e.symbolName));
       }
     }
-    initializers.addAll(exportedInitializers);
+    result.addAll(exportedInitializers);
   }
 
   /// Add an initializer to register [node] as a polymer element if it contains
   /// an appropriate [CustomTag] annotation.
   static _processClassDeclaration(ClassDeclaration node,
-      List<_Initializer> initializers, SourceFile file,
+      List<_Initializer> result, SourceFile file,
       TransformLogger logger) {
     for (var meta in node.metadata) {
       if (!_isCustomTagAnnotation(meta)) continue;
@@ -203,13 +242,13 @@
           'classes: $tagName', span: _getSpan(file, node.name));
         continue;
       }
-      initializers.add(new _CustomTagInitializer(tagName, typeName));
+      result.add(new _CustomTagInitializer(tagName, typeName));
     }
   }
 
   /// Add a method initializer for [function].
   static _processFunctionDeclaration(FunctionDeclaration function,
-      List<_Initializer> initializers, SourceFile file,
+      List<_Initializer> result, SourceFile file,
       TransformLogger logger) {
     var name = function.name.name;
     if (name.startsWith('_')) {
@@ -217,7 +256,7 @@
         'functions: $name', span: _getSpan(file, function.name));
       return;
     }
-    initializers.add(new _InitMethodInitializer(name));
+    result.add(new _InitMethodInitializer(name));
   }
 }
 
@@ -256,4 +295,5 @@
 library app_bootstrap;
 
 import 'package:polymer/polymer.dart';
+import 'package:smoke/static.dart' as smoke;
 """;
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 362a690..0fb09c2 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -4,45 +4,22 @@
 
 part of polymer;
 
-/// **Warning**: this class is experiental and subject to change.
+/// *Warning* this class is experimental and subject to change.
 ///
-/// The implementation for the `polymer-element` element.
-///
-/// Normally you do not need to use this class directly, see [PolymerElement].
-class PolymerDeclaration extends HtmlElement {
-  static const _TAG = 'polymer-element';
+/// The data associated with a polymer-element declaration, if it is backed
+/// by a Dart class instead of a JavaScript prototype.
+class PolymerDeclaration {
+  /// The polymer-element for this declaration.
+  final HtmlElement element;
 
-  factory PolymerDeclaration() => new Element.tag(_TAG);
-  // Fully ported from revision:
-  // https://github.com/Polymer/polymer/blob/b7200854b2441a22ce89f6563963f36c50f5150d
-  //
-  //   src/declaration/attributes.js
-  //   src/declaration/events.js
-  //   src/declaration/polymer-element.js
-  //   src/declaration/properties.js
-  //   src/declaration/prototype.js (note: most code not needed in Dart)
-  //   src/declaration/styles.js
-  //
-  // Not yet ported:
-  //   src/declaration/path.js - blocked on HTMLImports.getDocumentUrl
+  /// The Dart type corresponding to this custom element declaration.
+  final Type type;
 
-  Type _type;
-  Type get type => _type;
+  /// If we extend another custom element, this points to the super declaration.
+  final PolymerDeclaration superDeclaration;
 
-  // TODO(jmesserly): this is a cache, because it's tricky in Dart to get from
-  // Type -> Supertype.
-  Type _supertype;
-  Type get supertype => _supertype;
-
-  // TODO(jmesserly): this is also a cache, since we can't store .element on
-  // each level of the __proto__ like JS does.
-  PolymerDeclaration _super;
-  PolymerDeclaration get superDeclaration => _super;
-
-  String _extendsName;
-
-  String _name;
-  String get name => _name;
+  /// The name of the custom element.
+  final String name;
 
   /// Map of publish properties. Can be a field or a property getter, but if
   /// this map contains a getter, is because it also has a corresponding setter.
@@ -70,7 +47,7 @@
   List<Element> get styles => _styles;
 
   DocumentFragment get templateContent {
-    final template = this.querySelector('template');
+    final template = element.querySelector('template');
     return template != null ? templateBind(template).content : null;
   }
 
@@ -82,86 +59,24 @@
   // per element (why does the js implementation stores 1 per template node?)
   Expando<Set<String>> _templateDelegates;
 
-  PolymerDeclaration.created() : super.created() {
-    // fetch the element name
-    _name = attributes['name'];
-    // fetch our extendee name
-    _extendsName = attributes['extends'];
-    // install element definition, if ready
-    registerWhenReady();
-  }
+  String get extendee => superDeclaration != null ?
+      superDeclaration.name : null;
 
-  void registerWhenReady() {
-    // if we have no prototype, wait
-    if (waitingForType(name)) {
-      return;
-    }
-    if (waitingForExtendee(_extendsName)) {
-      //console.warn(name + ': waitingForExtendee:' + extendee);
-      return;
-    }
-    // TODO(sjmiles): HTMLImports polyfill awareness:
-    // elements in the main document are likely to parse
-    // in advance of elements in imports because the
-    // polyfill parser is simulated
-    // therefore, wait for imports loaded before
-    // finalizing elements in the main document
-    // TODO(jmesserly): Polymer.dart waits for HTMLImportsLoaded, so I've
-    // removed "whenImportsLoaded" for now. Restore the workaround if needed.
-    _register(_extendsName);
-  }
+  // Dart note: since polymer-element is handled in JS now, we have a simplified
+  // flow for registering. We don't need to wait for the supertype or the code
+  // to be noticed.
+  PolymerDeclaration(this.element, this.name, this.type, this.superDeclaration);
 
-  void _register(extendee) {
-    //console.group('registering', name);
-    register(name, extendee);
-    //console.groupEnd();
-    // subclasses may now register themselves
-    _notifySuper(name);
-  }
-
-  bool waitingForType(String name) {
-    if (_getRegisteredType(name) != null) return false;
-
-    // then wait for a prototype
-    _waitType[name] = this;
-    // if explicitly marked as 'noscript'
-    if (attributes.containsKey('noscript')) {
-      // TODO(sorvell): CustomElements polyfill awareness:
-      // noscript elements should upgrade in logical order
-      // script injection ensures this under native custom elements;
-      // under imports + ce polyfills, scripts run before upgrades.
-      // dependencies should be ready at upgrade time so register
-      // prototype at this time.
-      // TODO(jmesserly): I'm not sure how to port this; since script
-      // injection doesn't work for Dart, we'll just call Polymer.register
-      // here and hope for the best.
-      Polymer.register(name);
-    }
-    return true;
-  }
-
-  bool waitingForExtendee(String extendee) {
-    // if extending a custom element...
-    if (extendee != null && extendee.indexOf('-') >= 0) {
-      // wait for the extendee to be _registered first
-      if (!_isRegistered(extendee)) {
-        _waitSuper.putIfAbsent(extendee, () => []).add(this);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void register(String name, String extendee) {
+  void register() {
     // build prototype combining extendee, Polymer base, and named api
-    buildType(name, extendee);
+    buildType();
 
     // back reference declaration element
     // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
     _declarations[name] = this;
 
     // more declarative features
-    desugar(name, extendee);
+    desugar();
     // register our custom element
     registerType(name);
 
@@ -175,16 +90,9 @@
   ///
   /// *Note*: unlike the JavaScript version, we do not have to metaprogram the
   /// prototype, which simplifies this method.
-  void buildType(String name, String extendee) {
-    // get our custom type
-    _type = _getRegisteredType(name);
-
-    // get basal prototype
-    _supertype = _getRegisteredType(extendee);
-    if (_supertype != null) _super = _getDeclaration(extendee);
-
+  void buildType() {
     // transcribe `attributes` declarations onto own prototype's `publish`
-    publishAttributes(_super);
+    publishAttributes(superDeclaration);
 
     publishProperties();
 
@@ -202,7 +110,7 @@
   }
 
   /// Implement various declarative features.
-  void desugar(name, extendee) {
+  void desugar() {
     // compile list of attributes to copy to instances
     accumulateInstanceAttributes();
     // parse on-* delegates declared on `this` element
@@ -249,7 +157,7 @@
     var baseTag;
     var decl = this;
     while (decl != null) {
-      baseTag = decl.attributes['extends'];
+      baseTag = decl.element.attributes['extends'];
       decl = decl.superDeclaration;
     }
     document.register(name, type, extendsTag: baseTag);
@@ -264,10 +172,10 @@
       _publish = new Map.from(superDecl._publish);
     }
 
-    _publish = _getPublishedProperties(_type, _publish);
+    _publish = _getPublishedProperties(type, _publish);
 
     // merge names from 'attributes' attribute
-    var attrs = attributes['attributes'];
+    var attrs = element.attributes['attributes'];
     if (attrs != null) {
       // names='a b c' or names='a,b,c'
       // record each name for publishing
@@ -284,7 +192,7 @@
           continue;
         }
 
-        var decl = smoke.getDeclaration(_type, property);
+        var decl = smoke.getDeclaration(type, property);
         if (decl == null || decl.isMethod || decl.isFinal) {
           window.console.warn('property for attribute $attr of polymer-element '
               'name=$name not found.');
@@ -303,10 +211,12 @@
   void accumulateInstanceAttributes() {
     // inherit instance attributes
     _instanceAttributes = new Map<String, Object>();
-    if (_super != null) _instanceAttributes.addAll(_super._instanceAttributes);
+    if (superDeclaration != null) {
+      _instanceAttributes.addAll(superDeclaration._instanceAttributes);
+    }
 
     // merge attributes from element
-    attributes.forEach((name, value) {
+    element.attributes.forEach((name, value) {
       if (isInstanceAttribute(name)) {
         _instanceAttributes[name] = value;
       }
@@ -328,7 +238,7 @@
   }
 
   void addAttributeDelegates(Map<String, String> delegates) {
-    attributes.forEach((name, value) {
+    element.attributes.forEach((name, value) {
       if (_hasEventPrefix(name)) {
         var start = value.indexOf('{{');
         var end = value.lastIndexOf('}}');
@@ -388,7 +298,7 @@
   }
 
   List<Element> findNodes(String selector, [bool matcher(Element e)]) {
-    var nodes = this.querySelectorAll(selector).toList();
+    var nodes = element.querySelectorAll(selector).toList();
     var content = templateContent;
     if (content != null) {
       nodes = nodes..addAll(content.querySelectorAll(selector));
@@ -443,7 +353,7 @@
     var options = const smoke.QueryOptions(includeFields: false,
         includeProperties: false, includeMethods: true, includeInherited: true,
         includeUpTo: HtmlElement);
-    for (var decl in smoke.query(_type, options)) {
+    for (var decl in smoke.query(type, options)) {
       String name = smoke.symbolToName(decl.name);
       if (name.endsWith(_OBSERVE_SUFFIX) && name != 'attributeChanged') {
         // TODO(jmesserly): now that we have a better system, should we
@@ -461,7 +371,7 @@
     var options = const smoke.QueryOptions(includeFields: false,
         includeProperties: false, includeMethods: true, includeInherited: true,
         includeUpTo: HtmlElement, withAnnotations: const [ObserveProperty]);
-    for (var decl in smoke.query(_type, options)) {
+    for (var decl in smoke.query(type, options)) {
       for (var meta in decl.annotations) {
         if (meta is! ObserveProperty) continue;
         if (_observe == null) _observe = new HashMap();
@@ -491,26 +401,6 @@
 
 Type _getRegisteredType(String name) => _typesByName[name];
 
-/// elements waiting for prototype, by name
-final Map _waitType = new Map<String, PolymerDeclaration>();
-
-void _notifyType(String name) {
-  var waiting = _waitType.remove(name);
-  if (waiting != null) waiting.registerWhenReady();
-}
-
-/// elements waiting for super, by name
-final Map _waitSuper = new Map<String, List<PolymerDeclaration>>();
-
-void _notifySuper(String name) {
-  var waiting = _waitSuper.remove(name);
-  if (waiting != null) {
-    for (var w in waiting) {
-      w.registerWhenReady();
-    }
-  }
-}
-
 /// track document.register'ed tag names and their declarations
 final Map _declarations = new Map<String, PolymerDeclaration>();
 
@@ -549,8 +439,7 @@
   shadowCss.callMethod('shimStyling', [template, name, extendee]);
 }
 
-final bool _hasShadowDomPolyfill = js.context != null &&
-    js.context.hasProperty('ShadowDOMPolyfill');
+final bool _hasShadowDomPolyfill = js.context.hasProperty('ShadowDOMPolyfill');
 
 const _STYLE_SELECTOR = 'style';
 const _SHEET_SELECTOR = '[rel=stylesheet]';
@@ -564,7 +453,7 @@
 
   // In deploy mode we should never do a sync XHR; link rel=stylesheet will
   // be inlined into a <style> tag by ImportInliner.
-  if (_deployMode) return '';
+  if (loader.deployMode) return '';
 
   // TODO(jmesserly): sometimes the href property is wrong after deployment.
   var href = sheet.href;
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 1bd0a25..e218351 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -53,17 +53,6 @@
 /// If this class is used as a mixin,
 /// you must call `polymerCreated()` from the body of your constructor.
 abstract class Polymer implements Element, Observable, NodeBindExtension {
-  // Fully ported from revision:
-  // https://github.com/Polymer/polymer/blob/37eea00e13b9f86ab21c85a955585e8e4237e3d2
-  //
-  //   src/boot.js (static APIs on "Polymer" object)
-  //   src/instance/attributes.js
-  //   src/instance/base.js
-  //   src/instance/events.js
-  //   src/instance/mdv.js
-  //   src/instance/properties.js
-  //   src/instance/style.js
-  //   src/instance/utils.js
 
   // TODO(jmesserly): should this really be public?
   /// Regular expression that matches data-bindings.
@@ -83,8 +72,11 @@
     if (type == null) type = PolymerElement;
 
     _typesByName[name] = type;
-    // notify the registrar waiting for 'name', if any
-    _notifyType(name);
+
+    // Dart note: here we notify JS of the element registration. We don't pass
+    // the Dart type because we will handle that in PolymerDeclaration.
+    // See _hookJsPolymerDeclaration for how this is done.
+    (js.context['Polymer'] as JsFunction).apply([name]);
   }
 
   /// The one syntax to rule them all.
@@ -200,7 +192,7 @@
   void parseDeclarations(PolymerDeclaration declaration) {
     if (declaration != null) {
       parseDeclarations(declaration.superDeclaration);
-      parseDeclaration(declaration);
+      parseDeclaration(declaration.element);
     }
   }
 
@@ -210,7 +202,7 @@
 
     var root = null;
     if (template != null) {
-      if (_declaration.attributes.containsKey('lightdom')) {
+      if (_declaration.element.attributes.containsKey('lightdom')) {
         lightFromTemplate(template);
       } else {
         root = shadowFromTemplate(template);
@@ -659,7 +651,7 @@
     // TODO(sorvell): need to review, can do with ObserverTransform
     var v = bindable.value;
     if (v == null) {
-      bindable.value = reflect(this).getField(name).reflectee;
+      bindable.value = smoke.read(this, name);
     }
 
     // TODO(jmesserly): this will create another subscription.
@@ -867,7 +859,7 @@
   }
 
   Node findStyleController() {
-    if (js.context != null && js.context['ShadowDOMPolyfill'] != null) {
+    if (js.context.hasProperty('ShadowDOMPolyfill')) {
       return document.querySelector('head'); // get wrapped <head>.
     } else {
       // find the shadow root that contains this element
@@ -901,28 +893,6 @@
 
     scope.append(clone);
   }
-
-  /// Prevents flash of unstyled content
-  /// This is the list of selectors for veiled elements
-  static List<Element> veiledElements = ['body'];
-
-  /// Apply unveil class.
-  static void unveilElements() {
-    window.requestAnimationFrame((_) {
-      var nodes = document.querySelectorAll('.$_VEILED_CLASS');
-      for (var node in nodes) {
-        (node.classes)..add(_UNVEIL_CLASS)..remove(_VEILED_CLASS);
-      }
-      // NOTE: depends on transition end event to remove 'unveil' class.
-      if (nodes.isNotEmpty) {
-        window.onTransitionEnd.first.then((_) {
-          for (var node in nodes) {
-            node.classes.remove(_UNVEIL_CLASS);
-          }
-        });
-      }
-    });
-  }
 }
 
 // Dart note: Polymer addresses n-way bindings by metaprogramming: redefine
diff --git a/pkg/polymer/lib/src/js/polymer/AUTHORS b/pkg/polymer/lib/src/js/polymer/AUTHORS
new file mode 100644
index 0000000..0617765
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/AUTHORS
@@ -0,0 +1,9 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+#   Name <email address>
+#
+# For organizations:
+#   Organization <fnmatch pattern>
+#
+Google Inc. <*@google.com>
diff --git a/pkg/polymer/lib/src/js/polymer/CONTRIBUTING.md b/pkg/polymer/lib/src/js/polymer/CONTRIBUTING.md
new file mode 100644
index 0000000..1de2f34
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/CONTRIBUTING.md
@@ -0,0 +1,73 @@
+# Contributing
+
+Want to contribute to Polymer? Great!
+
+We are more than happy to accept external contributions to the project in the form of [feedback](https://groups.google.com/forum/?fromgroups=#!forum/polymer-dev), [bug reports](../../issues), and pull requests.
+
+## Contributor License Agreement
+
+Before we can accept patches, there's a quick web form you need to fill out.
+
+- If you're contributing as an individual (e.g. you own the intellectual property), fill out [this form](http://code.google.com/legal/individual-cla-v1.0.html).
+- If you're contributing under a company, fill out [this form](http://code.google.com/legal/corporate-cla-v1.0.html) instead.
+
+This CLA asserts that contributions are owned by you and that we can license all work under our [license](LICENSE).
+
+Other projects require a similar agreement: jQuery, Firefox, Apache, Node, and many more.
+
+[More about CLAs](https://www.google.com/search?q=Contributor%20License%20Agreement)
+
+## Initial setup
+
+Here's an easy guide that should get you up and running:
+
+1. Setup Grunt: `sudo npm install -g grunt-cli`
+1. Fork the project on github and pull down your copy.
+   > replace the {{ username }} with your username and {{ repository }} with the repository name
+
+        git clone git@github.com:{{ username }}/{{ repository }}.git --recursive
+
+    Note the `--recursive`. This is necessary for submodules to initialize properly. If you don't do a recursive clone, you'll have to init them manually:
+
+        git submodule init
+        git submodule update
+
+    Download and run the `pull-all.sh` script to install the sibling dependencies.
+
+        git clone git://github.com/Polymer/tools.git && tools/bin/pull-all.sh
+
+1. Test your change
+   > in the repo you've made changes to, run the tests:
+
+        cd $REPO
+        npm install
+        grunt test
+
+1. Commit your code and make a pull request.
+
+That's it for the one time setup. Now you're ready to make a change.
+
+## Submitting a pull request
+
+We iterate fast! To avoid potential merge conflicts, it's a good idea to pull from the main project before making a change and submitting a pull request. The easiest way to do this is setup a remote called `upstream` and do a pull before working on a change:
+
+    git remote add upstream git://github.com/Polymer/{{ repository }}.git
+
+Then before making a change, do a pull from the upstream `master` branch:
+
+    git pull upstream master
+
+To make life easier, add a "pull upstream" alias in your `.gitconfig`:
+
+    [alias]
+      pu = !"git fetch origin -v; git fetch upstream -v; git merge upstream/master"
+
+That will pull in changes from your forked repo, the main (upstream) repo, and merge the two. Then it's just a matter of running `git pu` before a change and pushing to your repo:
+
+    git checkout master
+    git pu
+    # make change
+    git commit -a -m 'Awesome things.'
+    git push
+
+Lastly, don't forget to submit the pull request.
diff --git a/pkg/polymer/lib/src/js/polymer/LICENSE b/pkg/polymer/lib/src/js/polymer/LICENSE
new file mode 100644
index 0000000..95987ba
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/LICENSE
@@ -0,0 +1,27 @@
+// Copyright (c) 2014 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/polymer/lib/src/js/polymer/PATENTS b/pkg/polymer/lib/src/js/polymer/PATENTS
new file mode 100644
index 0000000..e120963
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/PATENTS
@@ -0,0 +1,23 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Polymer project.
+
+Google hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Polymer, where such license applies only to those
+patent claims, both currently owned or controlled by Google and acquired
+in the future, licensable by Google that are necessarily infringed by
+this implementation of Polymer.  This grant does not include claims
+that would be infringed only as a consequence of further modification of
+this implementation.  If you or your agent or exclusive licensee
+institute or order or agree to the institution of patent litigation
+against any entity (including a cross-claim or counterclaim in a
+lawsuit) alleging that this implementation of Polymer or any code
+incorporated within this implementation of Polymer constitutes
+direct or contributory patent infringement, or inducement of patent
+infringement, then any patent rights granted to you under this License
+for this implementation of Polymer shall terminate as of the date
+such litigation is filed.
diff --git a/pkg/polymer/lib/src/js/polymer/README.md b/pkg/polymer/lib/src/js/polymer/README.md
new file mode 100644
index 0000000..2d54458
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/README.md
@@ -0,0 +1,17 @@
+# Polymer
+
+[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/polymer/README)](https://github.com/igrigorik/ga-beacon)
+
+Build Status: [http://build.chromium.org/p/client.polymer/waterfall](http://build.chromium.org/p/client.polymer/waterfall)
+
+## Brief Overview
+
+For more detailed info goto [http://polymer-project.org/](http://polymer-project.org/).
+
+Polymer is a new type of library for the web, designed to leverage the existing browser infrastructure to provide the encapsulation and extendability currently only available in JS libraries.
+
+Polymer is based on a set of future technologies, including [Shadow DOM](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html), [Custom Elements](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html) and Model Driven Views. Currently these technologies are implemented as polyfills or shims, but as browsers adopt these features natively, the platform code that drives Polymer evacipates, leaving only the value-adds.
+
+## Tools & Testing
+
+For running tests or building minified files, consult the [tooling information](http://polymer-project.org/tooling-strategy.html).
diff --git a/pkg/polymer/lib/src/js/polymer/bower.json b/pkg/polymer/lib/src/js/polymer/bower.json
new file mode 100644
index 0000000..816d40a
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/bower.json
@@ -0,0 +1,20 @@
+{
+  "name": "polymer",
+  "description": "Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.",
+  "homepage": "http://www.polymer-project.org/",
+  "keywords": [
+    "util",
+    "client",
+    "browser",
+    "web components",
+    "web-components"
+  ],
+  "author": "Polymer Authors <polymer-dev@googlegroups.com>",
+  "main": [
+    "polymer.js"
+  ],
+  "dependencies": {
+    "platform": "Polymer/platform#0.2.0"
+  },
+  "version": "0.2.0"
+}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
new file mode 100644
index 0000000..4fdddcc
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -0,0 +1,38 @@
+BUILD LOG
+---------
+Build Time: 2014-03-05T20:10:31
+
+NODEJS INFORMATION
+==================
+nodejs: v0.8.21
+chai: 1.9.0
+grunt: 0.4.2
+grunt-audit: 0.0.2
+grunt-concat-sourcemap: 0.4.1
+grunt-contrib-concat: 0.3.0
+grunt-contrib-uglify: 0.3.2
+grunt-contrib-yuidoc: 0.5.0
+grunt-karma: 0.6.2
+karma: 0.10.9
+karma-chrome-launcher: 0.1.2
+karma-coffee-preprocessor: 0.1.2
+karma-crbot-reporter: 0.0.4
+karma-firefox-launcher: 0.1.3
+karma-html2js-preprocessor: 0.1.0
+karma-ie-launcher: 0.1.1
+karma-jasmine: 0.1.5
+karma-mocha: 0.1.1
+karma-phantomjs-launcher: 0.1.2
+karma-requirejs: 0.2.1
+karma-safari-launcher: 0.1.1
+karma-script-launcher: 0.1.0
+mocha: 1.17.1
+requirejs: 2.1.10
+
+REPO REVISIONS
+==============
+polymer-dev: e6f6d2bdd318941562e46bc18adc8da2312cec36
+
+BUILD HASHES
+============
+build/polymer.js: 183c6dd1ffc466c8a4667562e21830b361710e96
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer-body.html b/pkg/polymer/lib/src/js/polymer/polymer-body.html
new file mode 100644
index 0000000..5f07a01
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer-body.html
@@ -0,0 +1,33 @@
+<polymer-element name="polymer-body" extends="body">
+
+  <script>
+
+  // upgrade polymer-body last so that it can contain other imported elements
+  document.addEventListener('polymer-ready', function() {
+    
+    Polymer('polymer-body', Platform.mixin({
+
+      created: function() {
+        this.template = document.createElement('template');
+        var body = wrap(document).body;
+        var c$ = body.childNodes.array();
+        for (var i=0, c; (c=c$[i]); i++) {
+          if (c.localName !== 'script') {
+            this.template.content.appendChild(c);
+          }
+        }
+        // snarf up user defined model
+        window.model = this;
+      },
+
+      parseDeclaration: function(elementElement) {
+        this.lightFromTemplate(this.template);
+      }
+
+    }, window.model));
+
+  });
+
+  </script>
+
+</polymer-element>
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
new file mode 100644
index 0000000..44c0afb
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -0,0 +1,2357 @@
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+Polymer = {};
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+// TODO(sorvell): this ensures Polymer is an object and not a function
+// Platform is currently defining it as a function to allow for async loading
+// of polymer; once we refine the loading process this likely goes away.
+if (typeof window.Polymer === 'function') {
+  Polymer = {};
+}
+
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // copy own properties from 'api' to 'prototype, with name hinting for 'super'
+  function extend(prototype, api) {
+    if (prototype && api) {
+      // use only own properties of 'api'
+      Object.getOwnPropertyNames(api).forEach(function(n) {
+        // acquire property descriptor
+        var pd = Object.getOwnPropertyDescriptor(api, n);
+        if (pd) {
+          // clone property via descriptor
+          Object.defineProperty(prototype, n, pd);
+          // cache name-of-method for 'super' engine
+          if (typeof pd.value == 'function') {
+            // hint the 'super' engine
+            pd.value.nom = n;
+          }
+        }
+      });
+    }
+    return prototype;
+  }
+  
+  // exports
+
+  scope.extend = extend;
+
+})(Polymer);
+
+/* 
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  
+  // usage
+  
+  // invoke cb.call(this) in 100ms, unless the job is re-registered,
+  // which resets the timer
+  // 
+  // this.myJob = this.job(this.myJob, cb, 100)
+  //
+  // returns a job handle which can be used to re-register a job
+
+  var Job = function(inContext) {
+    this.context = inContext;
+    this.boundComplete = this.complete.bind(this)
+  };
+  Job.prototype = {
+    go: function(callback, wait) {
+      this.callback = callback;
+      var h;
+      if (!wait) {
+        h = requestAnimationFrame(this.boundComplete);
+        this.handle = function() {
+          cancelAnimationFrame(h);
+        }
+      } else {
+        h = setTimeout(this.boundComplete, wait);
+        this.handle = function() {
+          clearTimeout(h);
+        }
+      }
+    },
+    stop: function() {
+      if (this.handle) {
+        this.handle();
+        this.handle = null;
+      }
+    },
+    complete: function() {
+      if (this.handle) {
+        this.stop();
+        this.callback.call(this.context);
+      }
+    }
+  };
+  
+  function job(job, callback, wait) {
+    if (job) {
+      job.stop();
+    } else {
+      job = new Job(this);
+    }
+    job.go(callback, wait);
+    return job;
+  }
+  
+  // exports 
+
+  scope.job = job;
+  
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  var registry = {};
+
+  HTMLElement.register = function(tag, prototype) {
+    registry[tag] = prototype;
+  }
+
+  // get prototype mapped to node <tag>
+  HTMLElement.getPrototypeForTag = function(tag) {
+    var prototype = !tag ? HTMLElement.prototype : registry[tag];
+    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
+    return prototype || Object.getPrototypeOf(document.createElement(tag));
+  };
+
+  // we have to flag propagation stoppage for the event dispatcher
+  var originalStopPropagation = Event.prototype.stopPropagation;
+  Event.prototype.stopPropagation = function() {
+    this.cancelBubble = true;
+    originalStopPropagation.apply(this, arguments);
+  };
+  
+  // TODO(sorvell): remove when we're sure imports does not need
+  // to load stylesheets
+  /*
+  HTMLImports.importer.preloadSelectors += 
+      ', polymer-element link[rel=stylesheet]';
+  */
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+ (function(scope) {
+    // super
+
+    // `arrayOfArgs` is an optional array of args like one might pass
+    // to `Function.apply`
+
+    // TODO(sjmiles):
+    //    $super must be installed on an instance or prototype chain
+    //    as `super`, and invoked via `this`, e.g.
+    //      `this.super();`
+
+    //    will not work if function objects are not unique, for example,
+    //    when using mixins.
+    //    The memoization strategy assumes each function exists on only one 
+    //    prototype chain i.e. we use the function object for memoizing)
+    //    perhaps we can bookkeep on the prototype itself instead
+    function $super(arrayOfArgs) {
+      // since we are thunking a method call, performance is important here: 
+      // memoize all lookups, once memoized the fast path calls no other 
+      // functions
+      //
+      // find the caller (cannot be `strict` because of 'caller')
+      var caller = $super.caller;
+      // memoized 'name of method' 
+      var nom = caller.nom;
+      // memoized next implementation prototype
+      var _super = caller._super;
+      if (!_super) {
+        if (!nom) {
+          nom = caller.nom = nameInThis.call(this, caller);
+        }
+        if (!nom) {
+          console.warn('called super() on a method not installed declaratively (has no .nom property)');
+        }
+        // super prototype is either cached or we have to find it
+        // by searching __proto__ (at the 'top')
+        _super = memoizeSuper(caller, nom, getPrototypeOf(this));
+      }
+      if (!_super) {
+        // if _super is falsey, there is no super implementation
+        //console.warn('called $super(' + nom + ') where there is no super implementation');
+      } else {
+        // our super function
+        var fn = _super[nom];
+        // memoize information so 'fn' can call 'super'
+        if (!fn._super) {
+          memoizeSuper(fn, nom, _super);
+        }
+        // invoke the inherited method
+        // if 'fn' is not function valued, this will throw
+        return fn.apply(this, arrayOfArgs || []);
+      }
+    }
+
+    function nextSuper(proto, name, caller) {
+      // look for an inherited prototype that implements name
+      while (proto) {
+        if ((proto[name] !== caller) && proto[name]) {
+          return proto;
+        }
+        proto = getPrototypeOf(proto);
+      }
+    }
+
+    function memoizeSuper(method, name, proto) {
+      // find and cache next prototype containing `name`
+      // we need the prototype so we can do another lookup
+      // from here
+      method._super = nextSuper(proto, name, method);
+      if (method._super) {
+        // _super is a prototype, the actual method is _super[name]
+        // tag super method with it's name for further lookups
+        method._super[name].nom = name;
+      }
+      return method._super;
+    }
+
+    function nameInThis(value) {
+      var p = this.__proto__;
+      while (p && p !== HTMLElement.prototype) {
+        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive
+        var n$ = Object.getOwnPropertyNames(p);
+        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {
+          var d = Object.getOwnPropertyDescriptor(p, n);
+          if (typeof d.value === 'function' && d.value === value) {
+            return n;
+          }
+        }
+        p = p.__proto__;
+      }
+    }
+
+    // NOTE: In some platforms (IE10) the prototype chain is faked via 
+    // __proto__. Therefore, always get prototype via __proto__ instead of
+    // the more standard Object.getPrototypeOf.
+    function getPrototypeOf(prototype) {
+      return prototype.__proto__;
+    }
+
+    // utility function to precompute name tags for functions
+    // in a (unchained) prototype
+    function hintSuper(prototype) {
+      // tag functions with their prototype name to optimize
+      // super call invocations
+      for (var n in prototype) {
+        var pd = Object.getOwnPropertyDescriptor(prototype, n);
+        if (pd && typeof pd.value === 'function') {
+          pd.value.nom = n;
+        }
+      }
+    }
+
+    // exports
+
+    scope.super = $super;
+
+})(Polymer);
+
+/* 
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+
+  var typeHandlers = {
+    string: function(value) {
+      return value;
+    },
+    date: function(value) {
+      return new Date(Date.parse(value) || Date.now());
+    },
+    boolean: function(value) {
+      if (value === '') {
+        return true;
+      }
+      return value === 'false' ? false : !!value;
+    },
+    number: function(value) {
+      var n = parseFloat(value);
+      // hex values like "0xFFFF" parseFloat as 0
+      if (n === 0) {
+        n = parseInt(value);
+      }
+      return isNaN(n) ? value : n;
+      // this code disabled because encoded values (like "0xFFFF")
+      // do not round trip to their original format
+      //return (String(floatVal) === value) ? floatVal : value;
+    },
+    object: function(value, currentValue) {
+      if (currentValue === null) {
+        return value;
+      }
+      try {
+        // If the string is an object, we can parse is with the JSON library.
+        // include convenience replace for single-quotes. If the author omits
+        // quotes altogether, parse will fail.
+        return JSON.parse(value.replace(/'/g, '"'));
+      } catch(e) {
+        // The object isn't valid JSON, return the raw value
+        return value;
+      }
+    },
+    // avoid deserialization of functions
+    'function': function(value, currentValue) {
+      return currentValue;
+    }
+  };
+
+  function deserializeValue(value, currentValue) {
+    // attempt to infer type from default value
+    var inferredType = typeof currentValue;
+    // invent 'date' type value for Date
+    if (currentValue instanceof Date) {
+      inferredType = 'date';
+    }
+    // delegate deserialization via type string
+    return typeHandlers[inferredType](value, currentValue);
+  }
+
+  // exports
+
+  scope.deserializeValue = deserializeValue;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+
+  // module
+
+  var api = {};
+
+  api.declaration = {};
+  api.instance = {};
+
+  api.publish = function(apis, prototype) {
+    for (var n in apis) {
+      extend(prototype, apis[n]);
+    }
+  }
+
+  // exports
+
+  scope.api = api;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  var utils = {
+    /**
+      * Invokes a function asynchronously. The context of the callback
+      * function is bound to 'this' automatically.
+      * @method async
+      * @param {Function|String} method
+      * @param {any|Array} args
+      * @param {number} timeout
+      */
+    async: function(method, args, timeout) {
+      // when polyfilling Object.observe, ensure changes 
+      // propagate before executing the async method
+      Platform.flush();
+      // second argument to `apply` must be an array
+      args = (args && args.length) ? args : [args];
+      // function to invoke
+      var fn = function() {
+        (this[method] || method).apply(this, args);
+      }.bind(this);
+      // execute `fn` sooner or later
+      var handle = timeout ? setTimeout(fn, timeout) :
+          requestAnimationFrame(fn);
+      // NOTE: switch on inverting handle to determine which time is used.
+      return timeout ? handle : 1 / handle;
+    },
+    cancelAsync: function(handle) {
+      if (handle < 1) {
+        cancelAnimationFrame(Math.round(1 / handle));
+      } else {
+        clearTimeout(handle);
+      }
+    },
+    /**
+      * Fire an event.
+      * @method fire
+      * @returns {Object} event
+      * @param {string} type An event name.
+      * @param {any} detail
+      * @param {Node} onNode Target node.
+      */
+    fire: function(type, detail, onNode, bubbles, cancelable) {
+      var node = onNode || this;
+      var detail = detail || {};
+      var event = new CustomEvent(type, {
+        bubbles: (bubbles !== undefined ? bubbles : true), 
+        cancelable: (cancelable !== undefined ? cancelable : true), 
+        detail: detail
+      });
+      node.dispatchEvent(event);
+      return event;
+    },
+    /**
+      * Fire an event asynchronously.
+      * @method asyncFire
+      * @param {string} type An event name.
+      * @param detail
+      * @param {Node} toNode Target node.
+      */
+    asyncFire: function(/*inType, inDetail*/) {
+      this.async("fire", arguments);
+    },
+    /**
+      * Remove class from old, add class to anew, if they exist
+      * @param classFollows
+      * @param anew A node.
+      * @param old A node
+      * @param className
+      */
+    classFollows: function(anew, old, className) {
+      if (old) {
+        old.classList.remove(className);
+      }
+      if (anew) {
+        anew.classList.add(className);
+      }
+    }
+  };
+
+  // no-operation function for handy stubs
+  var nop = function() {};
+
+  // null-object for handy stubs
+  var nob = {};
+
+  // deprecated
+
+  utils.asyncMethod = utils.async;
+
+  // exports
+
+  scope.api.instance.utils = utils;
+  scope.nop = nop;
+  scope.nob = nob;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  var EVENT_PREFIX = 'on-';
+
+  // instance events api
+  var events = {
+    // read-only
+    EVENT_PREFIX: EVENT_PREFIX,
+    // event listeners on host
+    addHostListeners: function() {
+      var events = this.eventDelegates;
+      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
+      // NOTE: host events look like bindings but really are not;
+      // (1) we don't want the attribute to be set and (2) we want to support
+      // multiple event listeners ('host' and 'instance') and Node.bind
+      // by default supports 1 thing being bound.
+      // We do, however, leverage the event hookup code in PolymerExpressions
+      // so that we have a common code path for handling declarative events.
+      var self = this, bindable, eventName;
+      for (var n in events) {
+        eventName = EVENT_PREFIX + n;
+        bindable = PolymerExpressions.prepareEventBinding(
+          Path.get(events[n]),
+          eventName, 
+          {
+            resolveEventHandler: function(model, path, node) {
+              var fn = path.getValueFrom(self);
+              if (fn) {
+                return fn.bind(self);
+              }
+            }
+          }
+        );
+        bindable(this, this, false);
+      }
+    },
+    // call 'method' or function method on 'obj' with 'args', if the method exists
+    dispatchMethod: function(obj, method, args) {
+      if (obj) {
+        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
+        var fn = typeof method === 'function' ? method : obj[method];
+        if (fn) {
+          fn[args ? 'apply' : 'call'](obj, args);
+        }
+        log.events && console.groupEnd();
+        Platform.flush();
+      }
+    }
+  };
+
+  // exports
+
+  scope.api.instance.events = events;
+
+})(Polymer);
+
+/*

+ * Copyright 2013 The Polymer Authors. All rights reserved.

+ * Use of this source code is governed by a BSD-style

+ * license that can be found in the LICENSE file.

+ */

+(function(scope) {

+

+  // instance api for attributes

+

+  var attributes = {

+    copyInstanceAttributes: function () {

+      var a$ = this._instanceAttributes;

+      for (var k in a$) {

+        if (!this.hasAttribute(k)) {

+          this.setAttribute(k, a$[k]);

+        }

+      }

+    },

+    // for each attribute on this, deserialize value to property as needed

+    takeAttributes: function() {

+      // if we have no publish lookup table, we have no attributes to take

+      // TODO(sjmiles): ad hoc

+      if (this._publishLC) {

+        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {

+          this.attributeToProperty(a.name, a.value);

+        }

+      }

+    },

+    // if attribute 'name' is mapped to a property, deserialize

+    // 'value' into that property

+    attributeToProperty: function(name, value) {

+      // try to match this attribute to a property (attributes are

+      // all lower-case, so this is case-insensitive search)

+      var name = this.propertyForAttribute(name);

+      if (name) {

+        // filter out 'mustached' values, these are to be

+        // replaced with bound-data and are not yet values

+        // themselves

+        if (value && value.search(scope.bindPattern) >= 0) {

+          return;

+        }

+        // get original value

+        var currentValue = this[name];

+        // deserialize Boolean or Number values from attribute

+        var value = this.deserializeValue(value, currentValue);

+        // only act if the value has changed

+        if (value !== currentValue) {

+          // install new value (has side-effects)

+          this[name] = value;

+        }

+      }

+    },

+    // return the published property matching name, or undefined

+    propertyForAttribute: function(name) {

+      var match = this._publishLC && this._publishLC[name];

+      //console.log('propertyForAttribute:', name, 'matches', match);

+      return match;

+    },

+    // convert representation of 'stringValue' based on type of 'currentValue'

+    deserializeValue: function(stringValue, currentValue) {

+      return scope.deserializeValue(stringValue, currentValue);

+    },

+    serializeValue: function(value, inferredType) {

+      if (inferredType === 'boolean') {

+        return value ? '' : undefined;

+      } else if (inferredType !== 'object' && inferredType !== 'function'

+          && value !== undefined) {

+        return value;

+      }

+    },

+    reflectPropertyToAttribute: function(name) {

+      var inferredType = typeof this[name];

+      // try to intelligently serialize property value

+      var serializedValue = this.serializeValue(this[name], inferredType);

+      // boolean properties must reflect as boolean attributes

+      if (serializedValue !== undefined) {

+        this.setAttribute(name, serializedValue);

+        // TODO(sorvell): we should remove attr for all properties

+        // that have undefined serialization; however, we will need to

+        // refine the attr reflection system to achieve this; pica, for example,

+        // relies on having inferredType object properties not removed as

+        // attrs.

+      } else if (inferredType === 'boolean') {

+        this.removeAttribute(name);

+      }

+    }

+  };

+

+  // exports

+

+  scope.api.instance.attributes = attributes;

+

+})(Polymer);

+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var log = window.logFlags || {};
+
+  // magic words
+
+  var OBSERVE_SUFFIX = 'Changed';
+
+  // element api
+
+  var empty = [];
+
+  var properties = {
+    observeProperties: function() {
+      var n$ = this._observeNames, pn$ = this._publishNames;
+      if ((n$ && n$.length) || (pn$ && pn$.length)) {
+        var self = this;
+        var o = this._propertyObserver = new CompoundObserver();
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          o.addPath(this, n);
+          // observer array properties
+          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);
+          if (pd && pd.value) {
+            this.observeArrayValue(n, pd.value, null);
+          }
+        }
+        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {
+          if (!this.observe || (this.observe[n] === undefined)) {
+            o.addPath(this, n);
+          }
+        }
+        o.open(this.notifyPropertyChanges, this);
+      }
+    },
+    notifyPropertyChanges: function(newValues, oldValues, paths) {
+      var name, method, called = {};
+      for (var i in oldValues) {
+        // note: paths is of form [object, path, object, path]
+        name = paths[2 * i + 1];
+        if (this.publish[name] !== undefined) {
+          this.reflectPropertyToAttribute(name);
+        }
+        method = this.observe[name];
+        if (method) {
+          this.observeArrayValue(name, newValues[i], oldValues[i]);
+          if (!called[method]) {
+            called[method] = true;
+            // observes the value if it is an array
+            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);
+          }
+        }
+      }
+    },
+    observeArrayValue: function(name, value, old) {
+      // we only care if there are registered side-effects
+      var callbackName = this.observe[name];
+      if (callbackName) {
+        // if we are observing the previous value, stop
+        if (Array.isArray(old)) {
+          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
+          this.unregisterObserver(name + '__array');
+        }
+        // if the new value is an array, being observing it
+        if (Array.isArray(value)) {
+          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
+          var observer = new ArrayObserver(value);
+          observer.open(function(value, old) {
+            this.invokeMethod(callbackName, [old]);
+          }, this);
+          this.registerObserver(name + '__array', observer);
+        }
+      }
+    },
+    bindProperty: function(property, observable) {
+      // apply Polymer two-way reference binding
+      return bindProperties(this, property, observable);
+    },
+    unbindAllProperties: function() {
+      if (this._propertyObserver) {
+        this._propertyObserver.close();
+      }
+      this.unregisterObservers();
+    },
+    unbindProperty: function(name) {
+      return this.unregisterObserver(name);
+    },
+    invokeMethod: function(method, args) {
+      var fn = this[method] || method;
+      if (typeof fn === 'function') {
+        fn.apply(this, args);
+      }
+    },
+    // bookkeeping observers for memory management
+    registerObserver: function(name, observer) {
+      var o$ = this._observers || (this._observers = {});
+      o$[name] = observer;
+    },
+    unregisterObserver: function(name) {
+      var o$ = this._observers;
+      if (o$ && o$[name]) {
+        o$[name].close();
+        o$[name] = null;
+        return true;
+      }
+    },
+    unregisterObservers: function() {
+      if (this._observers) {
+        var keys=Object.keys(this._observers);
+        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
+          o = this._observers[k];
+          o.close();
+        }
+        this._observers = {};
+      }
+    }
+  };
+
+  // property binding
+  // bind a property in A to a path in B by converting A[property] to a
+  // getter/setter pair that accesses B[...path...]
+  function bindProperties(inA, inProperty, observable) {
+    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);
+    // capture A's value if B's value is null or undefined,
+    // otherwise use B's value
+    // TODO(sorvell): need to review, can do with ObserverTransform
+    var v = observable.discardChanges();
+    if (v === null || v === undefined) {
+      observable.setValue(inA[inProperty]);
+    }
+    return Observer.defineComputedProperty(inA, inProperty, observable);
+  }
+
+  // logging
+  var LOG_OBSERVE = '[%s] watching [%s]';
+  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
+  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
+  var LOG_BIND_PROPS = "[%s]: bindProperties: [%s] to [%s].[%s]";
+
+  // exports
+
+  scope.api.instance.properties = properties;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var log = window.logFlags || 0;
+  var events = scope.api.instance.events;
+
+  var syntax = new PolymerExpressions();
+  syntax.resolveEventHandler = function(model, path, node) {
+    var ctlr = findEventController(node);
+    if (ctlr) {
+      var fn = path.getValueFrom(ctlr);
+      if (fn) {
+        return fn.bind(ctlr);
+      }
+    }
+  }
+
+  // An event controller is the host element for the shadowRoot in which 
+  // the node exists, or the first ancestor with a 'lightDomController'
+  // property.
+  function findEventController(node) {
+    while (node.parentNode) {
+      if (node.lightDomController) {
+        return node;
+      }
+      node = node.parentNode;
+    }
+    return node.host;
+  };
+
+  // element api supporting mdv
+
+  var mdv = {
+    syntax: syntax,
+    instanceTemplate: function(template) {
+      return template.createInstance(this, this.syntax);
+    },
+    bind: function(name, observable, oneTime) {
+      // note: binding is a prepare signal. This allows us to be sure that any
+      // property changes that occur as a result of binding will be observed.
+      if (!this._elementPrepared) {
+        this.prepareElement();
+      }
+      var property = this.propertyForAttribute(name);
+      if (!property) {
+        // TODO(sjmiles): this mixin method must use the special form
+        // of `super` installed by `mixinMethod` in declaration/prototype.js
+        return this.mixinSuper(arguments);
+      } else {
+        // clean out the closets
+        this.unbind(name);
+        // use n-way Polymer binding
+        var observer = this.bindProperty(property, observable);
+        // stick path on observer so it's available via this.bindings
+        observer.path = observable.path_;
+        // reflect bound property to attribute when binding
+        // to ensure binding is not left on attribute if property
+        // does not update due to not changing.
+        this.reflectPropertyToAttribute(property);
+        return this.bindings[name] = observer;
+      }
+    },
+    asyncUnbindAll: function() {
+      if (!this._unbound) {
+        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
+        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
+      }
+    },
+    unbindAll: function() {
+      if (!this._unbound) {
+        this.unbindAllProperties();
+        this.super();
+        // unbind shadowRoot
+        var root = this.shadowRoot;
+        while (root) {
+          unbindNodeTree(root);
+          root = root.olderShadowRoot;
+        }
+        this._unbound = true;
+      }
+    },
+    cancelUnbindAll: function(preventCascade) {
+      if (this._unbound) {
+        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
+        return;
+      }
+      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
+      if (this._unbindAllJob) {
+        this._unbindAllJob = this._unbindAllJob.stop();
+      }
+      // cancel unbinding our shadow tree iff we're not in the process of
+      // cascading our tree (as we do, for example, when the element is inserted).
+      if (!preventCascade) {
+        forNodeTree(this.shadowRoot, function(n) {
+          if (n.cancelUnbindAll) {
+            n.cancelUnbindAll();
+          }
+        });
+      }
+    }
+  };
+
+  function unbindNodeTree(node) {
+    forNodeTree(node, _nodeUnbindAll);
+  }
+
+  function _nodeUnbindAll(node) {
+    node.unbindAll();
+  }
+
+  function forNodeTree(node, callback) {
+    if (node) {
+      callback(node);
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        forNodeTree(child, callback);
+      }
+    }
+  }
+
+  var mustachePattern = /\{\{([^{}]*)}}/;
+
+  // exports
+
+  scope.bindPattern = mustachePattern;
+  scope.api.instance.mdv = mdv;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+  var preparingElements = 0;
+
+  var base = {
+    PolymerBase: true,
+    job: Polymer.job,
+    super: Polymer.super,
+    // user entry point for element has had its createdCallback called
+    created: function() {
+    },
+    // user entry point for element has shadowRoot and is ready for
+    // api interaction
+    ready: function() {
+    },
+    createdCallback: function() {
+      this.created();
+      if (this.ownerDocument.defaultView || this.alwaysPrepare ||
+          preparingElements > 0) {
+        this.prepareElement();
+      }
+    },
+    // system entry point, do not override
+    prepareElement: function() {
+      this._elementPrepared = true;
+      // install shadowRoots storage
+      this.shadowRoots = {};
+      // install property observers
+      this.observeProperties();
+      // install boilerplate attributes
+      this.copyInstanceAttributes();
+      // process input attributes
+      this.takeAttributes();
+      // add event listeners
+      this.addHostListeners();
+      // guarantees that while preparing, any
+      // sub-elements are also prepared
+      preparingElements++;
+      // process declarative resources
+      this.parseDeclarations(this.__proto__);
+      // decrement semaphore
+      preparingElements--;
+      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
+      // :unresolved; remove this attribute to be compatible with native
+      // CE.
+      this.removeAttribute('unresolved');
+      // user entry point
+      this.ready();
+    },
+    attachedCallback: function() {
+      if (!this._elementPrepared) {
+        this.prepareElement();
+      }
+      this.cancelUnbindAll(true);
+      // invoke user action
+      if (this.attached) {
+        this.attached();
+      }
+      // TODO(sorvell): bc
+      if (this.enteredView) {
+        this.enteredView();
+      }
+      // NOTE: domReady can be used to access elements in dom (descendants, 
+      // ancestors, siblings) such that the developer is enured to upgrade
+      // ordering. If the element definitions have loaded, domReady
+      // can be used to access upgraded elements.
+      if (!this.hasBeenAttached) {
+        this.hasBeenAttached = true;
+        if (this.domReady) {
+          this.async('domReady');
+        }
+      }
+    },
+    detachedCallback: function() {
+      if (!this.preventDispose) {
+        this.asyncUnbindAll();
+      }
+      // invoke user action
+      if (this.detached) {
+        this.detached();
+      }
+      // TODO(sorvell): bc
+      if (this.leftView) {
+        this.leftView();
+      }
+    },
+    // TODO(sorvell): bc
+    enteredViewCallback: function() {
+      this.attachedCallback();
+    },
+    // TODO(sorvell): bc
+    leftViewCallback: function() {
+      this.detachedCallback();
+    },
+    // TODO(sorvell): bc
+    enteredDocumentCallback: function() {
+      this.attachedCallback();
+    },
+    // TODO(sorvell): bc
+    leftDocumentCallback: function() {
+      this.detachedCallback();
+    },
+    // recursive ancestral <element> initialization, oldest first
+    parseDeclarations: function(p) {
+      if (p && p.element) {
+        this.parseDeclarations(p.__proto__);
+        p.parseDeclaration.call(this, p.element);
+      }
+    },
+    // parse input <element> as needed, override for custom behavior
+    parseDeclaration: function(elementElement) {
+      var template = this.fetchTemplate(elementElement);
+      if (template) {
+        var root = this.shadowFromTemplate(template);
+        this.shadowRoots[elementElement.name] = root;        
+      }
+    },
+    // return a shadow-root template (if desired), override for custom behavior
+    fetchTemplate: function(elementElement) {
+      return elementElement.querySelector('template');
+    },
+    // utility function that creates a shadow root from a <template>
+    shadowFromTemplate: function(template) {
+      if (template) {
+        // make a shadow root
+        var root = this.createShadowRoot();
+        // migrate flag(s)
+        root.resetStyleInheritance = this.resetStyleInheritance;
+        // stamp template
+        // which includes parsing and applying MDV bindings before being 
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        root.appendChild(dom);
+        // perform post-construction initialization tasks on shadow root
+        this.shadowRootReady(root, template);
+        // return the created shadow root
+        return root;
+      }
+    },
+    // utility function that stamps a <template> into light-dom
+    lightFromTemplate: function(template) {
+      if (template) {
+        // TODO(sorvell): mark this element as a lightDOMController so that
+        // event listeners on bound nodes inside it will be called on it.
+        // Note, the expectation here is that events on all descendants 
+        // should be handled by this element.
+        this.lightDomController = true;
+        // stamp template
+        // which includes parsing and applying MDV bindings before being 
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        this.appendChild(dom);
+        // perform post-construction initialization tasks on ahem, light root
+        this.shadowRootReady(this, template);
+        // return the created shadow root
+        return dom;
+      }
+    },
+    shadowRootReady: function(root, template) {
+      // locate nodes with id and store references to them in this.$ hash
+      this.marshalNodeReferences(root);
+      // set up pointer gestures
+      PointerGestures.register(root);
+    },
+    // locate nodes with id and store references to them in this.$ hash
+    marshalNodeReferences: function(root) {
+      // establish $ instance variable
+      var $ = this.$ = this.$ || {};
+      // populate $ from nodes with ID from the LOCAL tree
+      if (root) {
+        var n$ = root.querySelectorAll("[id]");
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          $[n.id] = n;
+        };
+      }
+    },
+    attributeChangedCallback: function(name, oldValue) {
+      // TODO(sjmiles): adhoc filter
+      if (name !== 'class' && name !== 'style') {
+        this.attributeToProperty(name, this.getAttribute(name));
+      }
+      if (this.attributeChanged) {
+        this.attributeChanged.apply(this, arguments);
+      }
+    },
+    onMutation: function(node, listener) {
+      var observer = new MutationObserver(function(mutations) {
+        listener.call(this, observer, mutations);
+        observer.disconnect();
+      }.bind(this));
+      observer.observe(node, {childList: true, subtree: true});
+    }
+  };
+
+  // true if object has own PolymerBase api
+  function isBase(object) {
+    return object.hasOwnProperty('PolymerBase') 
+  }
+
+  // name a base constructor for dev tools
+
+  function PolymerBase() {};
+  PolymerBase.prototype = base;
+  base.constructor = PolymerBase;
+  
+  // exports
+
+  scope.Base = PolymerBase;
+  scope.isBase = isBase;
+  scope.api.instance.base = base;
+  
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  
+  // magic words
+  
+  var STYLE_SCOPE_ATTRIBUTE = 'element';
+  var STYLE_CONTROLLER_SCOPE = 'controller';
+  
+  var styles = {
+    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
+    /**
+     * Installs external stylesheets and <style> elements with the attribute 
+     * polymer-scope='controller' into the scope of element. This is intended
+     * to be a called during custom element construction. Note, this incurs a 
+     * per instance cost and should be used sparingly.
+     *
+     * The need for this type of styling should go away when the shadowDOM spec
+     * addresses these issues:
+     * 
+     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391
+     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390
+     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389
+     * 
+     * @param element The custom element instance into whose controller (parent)
+     * scope styles will be installed.
+     * @param elementElement The <element> containing controller styles.
+    */
+    // TODO(sorvell): remove when spec issues are addressed
+    installControllerStyles: function() {
+      // apply controller styles, but only if they are not yet applied
+      var scope = this.findStyleController();
+      if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {
+        // allow inherited controller styles
+        var proto = getPrototypeOf(this), cssText = '';
+        while (proto && proto.element) {
+          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
+          proto = getPrototypeOf(proto);
+        }
+        if (cssText) {
+          var style = this.element.cssTextToScopeStyle(cssText,
+              STYLE_CONTROLLER_SCOPE);
+          // TODO(sorvell): for now these styles are not shimmed
+          // but we may need to shim them
+          Polymer.applyStyleToScope(style, scope);
+        }
+      }
+    },
+    findStyleController: function() {
+      if (window.ShadowDOMPolyfill) {
+        return wrap(document.head);
+      } else {
+        // find the shadow root that contains this element
+        var n = this;
+        while (n.parentNode) {
+          n = n.parentNode;
+        }
+        return n === document ? document.head : n;
+      }
+    },
+    scopeHasElementStyle: function(scope, descriptor) {
+      var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;
+      return scope.querySelector('style[' + rule + ']');
+    }
+  };
+  
+  // NOTE: use raw prototype traversal so that we ensure correct traversal
+  // on platforms where the protoype chain is simulated via __proto__ (IE10)
+  function getPrototypeOf(prototype) {
+    return prototype.__proto__;
+  }
+
+  // exports
+
+  scope.api.instance.styles = styles;
+  
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+
+  // imperative implementation: Polymer()
+
+  // specify an 'own' prototype for tag `name`
+  function element(name, prototype) {
+    if (getRegisteredPrototype[name]) {
+      throw 'Already registered (Polymer) prototype for element ' + name;
+    }
+    // cache the prototype
+    registerPrototype(name, prototype);
+    // notify the registrar waiting for 'name', if any
+    notifyPrototype(name);
+  }
+
+  // async prototype source
+
+  function waitingForPrototype(name, client) {
+    waitPrototype[name] = client;
+  }
+
+  var waitPrototype = {};
+
+  function notifyPrototype(name) {
+    if (waitPrototype[name]) {
+      waitPrototype[name].registerWhenReady();
+      delete waitPrototype[name];
+    }
+  }
+
+  // utility and bookkeeping
+
+  // maps tag names to prototypes, as registered with
+  // Polymer. Prototypes associated with a tag name
+  // using document.registerElement are available from
+  // HTMLElement.getPrototypeForTag().
+  // If an element was fully registered by Polymer, then
+  // Polymer.getRegisteredPrototype(name) === 
+  //   HTMLElement.getPrototypeForTag(name)
+
+  var prototypesByName = {};
+
+  function registerPrototype(name, prototype) {
+    return prototypesByName[name] = prototype || {};
+  }
+
+  function getRegisteredPrototype(name) {
+    return prototypesByName[name];
+  }
+
+  // exports
+
+  scope.getRegisteredPrototype = getRegisteredPrototype;
+  scope.waitingForPrototype = waitingForPrototype;
+
+  // namespace shenanigans so we can expose our scope on the registration 
+  // function
+
+  // make window.Polymer reference `element()`
+
+  window.Polymer = element;
+
+  // TODO(sjmiles): find a way to do this that is less terrible
+  // copy window.Polymer properties onto `element()`
+
+  extend(Polymer, scope);
+
+  // Under the HTMLImports polyfill, scripts in the main document
+  // do not block on imports; we want to allow calls to Polymer in the main
+  // document. Platform collects those calls until we can process them, which
+  // we do here.
+
+  var declarations = Platform.deliverDeclarations();
+  if (declarations) {
+    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
+      element.apply(null, d);
+    }
+  }
+
+})(Polymer);
+
+/* 
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+
+var path = {
+  resolveElementPaths: function(node) {
+    Platform.urlResolver.resolveDom(node);
+  },
+  addResolvePathApi: function() {
+    // let assetpath attribute modify the resolve path
+    var assetPath = this.getAttribute('assetpath') || '';
+    var root = new URL(assetPath, this.ownerDocument.baseURI);
+    this.prototype.resolvePath = function(urlPath, base) {
+      var u = new URL(urlPath, base || root);
+      return u.href;
+    };
+  }
+};
+
+// exports
+scope.api.declaration.path = path;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  var api = scope.api.instance.styles;
+  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
+
+  // magic words
+
+  var STYLE_SELECTOR = 'style';
+  var STYLE_LOADABLE_MATCH = '@import';
+  var SHEET_SELECTOR = 'link[rel=stylesheet]';
+  var STYLE_GLOBAL_SCOPE = 'global';
+  var SCOPE_ATTR = 'polymer-scope';
+
+  var styles = {
+    // returns true if resources are loading
+    loadStyles: function(callback) {
+      var content = this.templateContent();
+      if (content) {
+        this.convertSheetsToStyles(content);
+      }
+      var styles = this.findLoadableStyles(content);
+      if (styles.length) {
+        Platform.styleResolver.loadStyles(styles, callback);
+      } else if (callback) {
+        callback();
+      }
+    },
+    convertSheetsToStyles: function(root) {
+      var s$ = root.querySelectorAll(SHEET_SELECTOR);
+      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
+        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
+            this.ownerDocument);
+        this.copySheetAttributes(c, s);
+        s.parentNode.replaceChild(c, s);
+      }
+    },
+    copySheetAttributes: function(style, link) {
+      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
+        if (a.name !== 'rel' && a.name !== 'src') {
+          style.setAttribute(a.name, a.value);
+        }
+      }
+    },
+    findLoadableStyles: function(root) {
+      var loadables = [];
+      if (root) {
+        var s$ = root.querySelectorAll(STYLE_SELECTOR);
+        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
+          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
+            loadables.push(s);
+          }
+        }
+      }
+      return loadables;
+    },
+    /**
+     * Install external stylesheets loaded in <polymer-element> elements into the 
+     * element's template.
+     * @param elementElement The <element> element to style.
+     */
+    // TODO(sorvell): wip... caching and styles handling can probably be removed
+    // We need a scheme to ensure stylesheets are eagerly loaded without 
+    // the creation of an element instance. Here are 2 options for handling this:
+    // 1. create a dummy element with ShadowDOM in dom that includes ALL styles
+    // processed here.
+    // 2. place stylesheets outside the element template. This will allow 
+    // imports to naturally load the sheets. Then at load time, we can remove
+    // the stylesheet from dom.
+    installSheets: function() {
+      this.cacheSheets();
+      this.cacheStyles();
+      this.installLocalSheets();
+      this.installGlobalStyles();
+    },
+    /**
+     * Remove all sheets from element and store for later use.
+     */
+    cacheSheets: function() {
+      this.sheets = this.findNodes(SHEET_SELECTOR);
+      this.sheets.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    cacheStyles: function() {
+      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
+      this.styles.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    /**
+     * Takes external stylesheets loaded in an <element> element and moves
+     * their content into a <style> element inside the <element>'s template.
+     * The sheet is then removed from the <element>. This is done only so 
+     * that if the element is loaded in the main document, the sheet does
+     * not become active.
+     * Note, ignores sheets with the attribute 'polymer-scope'.
+     * @param elementElement The <element> element to style.
+     */
+    installLocalSheets: function () {
+      var sheets = this.sheets.filter(function(s) {
+        return !s.hasAttribute(SCOPE_ATTR);
+      });
+      var content = this.templateContent();
+      if (content) {
+        var cssText = '';
+        sheets.forEach(function(sheet) {
+          cssText += cssTextFromSheet(sheet) + '\n';
+        });
+        if (cssText) {
+          var style = createStyleElement(cssText, this.ownerDocument);
+          content.insertBefore(style, content.firstChild);
+        }
+      }
+    },
+    findNodes: function(selector, matcher) {
+      var nodes = this.querySelectorAll(selector).array();
+      var content = this.templateContent();
+      if (content) {
+        var templateNodes = content.querySelectorAll(selector).array();
+        nodes = nodes.concat(templateNodes);
+      }
+      return matcher ? nodes.filter(matcher) : nodes;
+    },
+    templateContent: function() {
+      var template = this.querySelector('template');
+      return template && templateContent(template);
+    },
+    /**
+     * Promotes external stylesheets and <style> elements with the attribute 
+     * polymer-scope='global' into global scope.
+     * This is particularly useful for defining @keyframe rules which 
+     * currently do not function in scoped or shadow style elements.
+     * (See wkb.ug/72462)
+     * @param elementElement The <element> element to style.
+    */
+    // TODO(sorvell): remove when wkb.ug/72462 is addressed.
+    installGlobalStyles: function() {
+      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
+      applyStyleToScope(style, document.head);
+    },
+    cssTextForScope: function(scopeDescriptor) {
+      var cssText = '';
+      // handle stylesheets
+      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
+      var matcher = function(s) {
+        return matchesSelector(s, selector);
+      };
+      var sheets = this.sheets.filter(matcher);
+      sheets.forEach(function(sheet) {
+        cssText += cssTextFromSheet(sheet) + '\n\n';
+      });
+      // handle cached style elements
+      var styles = this.styles.filter(matcher);
+      styles.forEach(function(style) {
+        cssText += style.textContent + '\n\n';
+      });
+      return cssText;
+    },
+    styleForScope: function(scopeDescriptor) {
+      var cssText = this.cssTextForScope(scopeDescriptor);
+      return this.cssTextToScopeStyle(cssText, scopeDescriptor);
+    },
+    cssTextToScopeStyle: function(cssText, scopeDescriptor) {
+      if (cssText) {
+        var style = createStyleElement(cssText);
+        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
+            '-' + scopeDescriptor);
+        return style;
+      }
+    }
+  };
+
+  function importRuleForSheet(sheet, baseUrl) {
+    var href = new URL(sheet.getAttribute('href'), baseUrl).href;
+    return '@import \'' + href + '\';'
+  }
+
+  function applyStyleToScope(style, scope) {
+    if (style) {
+      // TODO(sorvell): necessary for IE
+      // see https://connect.microsoft.com/IE/feedback/details/790212/
+      // cloning-a-style-element-and-adding-to-document-produces
+      // -unexpected-result#details
+      // var clone = style.cloneNode(true);
+      var clone = createStyleElement(style.textContent);
+      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
+      if (attr) {
+        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
+      }
+      scope.appendChild(clone);
+    }
+  }
+
+  function createStyleElement(cssText, scope) {
+    scope = scope || document;
+    scope = scope.createElement ? scope : scope.ownerDocument;
+    var style = scope.createElement('style');
+    style.textContent = cssText;
+    return style;
+  }
+
+  function cssTextFromSheet(sheet) {
+    return (sheet && sheet.__resource) || '';
+  }
+
+  function matchesSelector(node, inSelector) {
+    if (matches) {
+      return matches.call(node, inSelector);
+    }
+  }
+  var p = HTMLElement.prototype;
+  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector 
+      || p.mozMatchesSelector;
+  
+  // exports
+
+  scope.api.declaration.styles = styles;
+  scope.applyStyleToScope = applyStyleToScope;
+  
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  var api = scope.api.instance.events;
+  var EVENT_PREFIX = api.EVENT_PREFIX;
+  // polymer-element declarative api: events feature
+
+  var events = { 
+    parseHostEvents: function() {
+      // our delegates map
+      var delegates = this.prototype.eventDelegates;
+      // extract data from attributes into delegates
+      this.addAttributeDelegates(delegates);
+    },
+    addAttributeDelegates: function(delegates) {
+      // for each attribute
+      for (var i=0, a; a=this.attributes[i]; i++) {
+        // does it have magic marker identifying it as an event delegate?
+        if (this.hasEventPrefix(a.name)) {
+          // if so, add the info to delegates
+          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
+              .replace('}}', '').trim();
+        }
+      }
+    },
+    // starts with 'on-'
+    hasEventPrefix: function (n) {
+      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
+    },
+    removeEventPrefix: function(n) {
+      return n.slice(prefixLength);
+    }
+  };
+
+  var prefixLength = EVENT_PREFIX.length;
+
+  // exports
+  scope.api.declaration.events = events;
+
+})(Polymer);
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // element api
+
+  var properties = {
+    inferObservers: function(prototype) {
+      // called before prototype.observe is chained to inherited object
+      var observe = prototype.observe, property;
+      for (var n in prototype) {
+        if (n.slice(-7) === 'Changed') {
+          if (!observe) {
+            observe  = (prototype.observe = {});
+          }
+          property = n.slice(0, -7)
+          observe[property] = observe[property] || n;
+        }
+      }
+    },
+    explodeObservers: function(prototype) {
+      // called before prototype.observe is chained to inherited object
+      var o = prototype.observe;
+      if (o) {
+        var exploded = {};
+        for (var n in o) {
+          var names = n.split(' ');
+          for (var i=0, ni; ni=names[i]; i++) {
+            exploded[ni] = o[n];
+          }
+        }
+        prototype.observe = exploded;
+      }
+    },
+    optimizePropertyMaps: function(prototype) {
+      if (prototype.observe) {
+        // construct name list
+        var a = prototype._observeNames = [];
+        for (var n in prototype.observe) {
+          var names = n.split(' ');
+          for (var i=0, ni; ni=names[i]; i++) {
+            a.push(ni);
+          }
+          //a.push(n);
+        }
+      }
+      if (prototype.publish) {
+        // construct name list
+        var a = prototype._publishNames = [];
+        for (var n in prototype.publish) {
+          a.push(n);
+        }
+      }
+    },
+    publishProperties: function(prototype, base) {
+      // if we have any properties to publish
+      var publish = prototype.publish;
+      if (publish) {
+        // transcribe `publish` entries onto own prototype
+        this.requireProperties(publish, prototype, base);
+        // construct map of lower-cased property names
+        prototype._publishLC = this.lowerCaseMap(publish);
+      }
+    },
+    requireProperties: function(properties, prototype, base) {
+      // ensure a prototype value for each property
+      for (var n in properties) {
+        if (prototype[n] === undefined && base[n] === undefined) {
+          prototype[n] = properties[n];
+        }
+      }
+    },
+    lowerCaseMap: function(properties) {
+      var map = {};
+      for (var n in properties) {
+        map[n.toLowerCase()] = n;
+      }
+      return map;
+    }
+  };
+
+  // exports
+
+  scope.api.declaration.properties = properties;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // magic words
+
+  var ATTRIBUTES_ATTRIBUTE = 'attributes';
+  var ATTRIBUTES_REGEX = /\s|,/;
+
+  // attributes api
+
+  var attributes = {
+    inheritAttributesObjects: function(prototype) {
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject(prototype, 'publishLC');
+      // chain our instance attributes map to the inherited version
+      this.inheritObject(prototype, '_instanceAttributes');
+    },
+    publishAttributes: function(prototype, base) {
+      // merge names from 'attributes' attribute
+      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
+      if (attributes) {
+        // get properties to publish
+        var publish = prototype.publish || (prototype.publish = {});
+        // names='a b c' or names='a,b,c'
+        var names = attributes.split(ATTRIBUTES_REGEX);
+        // record each name for publishing
+        for (var i=0, l=names.length, n; i<l; i++) {
+          // remove excess ws
+          n = names[i].trim();
+          // do not override explicit entries
+          if (n && publish[n] === undefined && base[n] === undefined) {
+            publish[n] = null;
+          }
+        }
+      }
+    },
+    // record clonable attributes from <element>
+    accumulateInstanceAttributes: function() {
+      // inherit instance attributes
+      var clonable = this.prototype._instanceAttributes;
+      // merge attributes from element
+      var a$ = this.attributes;
+      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  
+        if (this.isInstanceAttribute(a.name)) {
+          clonable[a.name] = a.value;
+        }
+      }
+    },
+    isInstanceAttribute: function(name) {
+      return !this.blackList[name] && name.slice(0,3) !== 'on-';
+    },
+    // do not clone these attributes onto instances
+    blackList: {
+      name: 1,
+      'extends': 1,
+      constructor: 1,
+      noscript: 1,
+      assetpath: 1,
+      'cache-csstext': 1
+    }
+  };
+
+  // add ATTRIBUTES_ATTRIBUTE to the blacklist
+  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
+
+  // exports
+
+  scope.api.declaration.attributes = attributes;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+  
+  var api = scope.api;
+  var isBase = scope.isBase;
+  var extend = scope.extend;
+
+  // prototype api
+
+  var prototype = {
+
+    register: function(name, extendeeName) {
+      // build prototype combining extendee, Polymer base, and named api
+      this.buildPrototype(name, extendeeName);
+      // register our custom element with the platform
+      this.registerPrototype(name, extendeeName);
+      // reference constructor in a global named by 'constructor' attribute
+      this.publishConstructor();
+    },
+
+    buildPrototype: function(name, extendeeName) {
+      // get our custom prototype (before chaining)
+      var extension = scope.getRegisteredPrototype(name);
+      // get basal prototype
+      var base = this.generateBasePrototype(extendeeName);
+      // implement declarative features
+      this.desugarBeforeChaining(extension, base);
+      // join prototypes
+      this.prototype = this.chainPrototypes(extension, base);
+      // more declarative features
+      this.desugarAfterChaining(name, extendeeName);
+    },
+
+    desugarBeforeChaining: function(prototype, base) {
+      // back reference declaration element
+      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
+      prototype.element = this;
+      // transcribe `attributes` declarations onto own prototype's `publish`
+      this.publishAttributes(prototype, base);
+      // `publish` properties to the prototype and to attribute watch
+      this.publishProperties(prototype, base);
+      // infer observers for `observe` list based on method names
+      this.inferObservers(prototype);
+      // desugar compound observer syntax, e.g. 'a b c' 
+      this.explodeObservers(prototype);
+    },
+
+    chainPrototypes: function(prototype, base) {
+      // chain various meta-data objects to inherited versions
+      this.inheritMetaData(prototype, base);
+      // chain custom api to inherited
+      var chained = this.chainObject(prototype, base);
+      // x-platform fixup
+      ensurePrototypeTraversal(chained);
+      return chained;
+    },
+
+    inheritMetaData: function(prototype, base) {
+      // chain observe object to inherited
+      this.inheritObject('observe', prototype, base);
+      // chain publish object to inherited
+      this.inheritObject('publish', prototype, base);
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject('_publishLC', prototype, base);
+      // chain our instance attributes map to the inherited version
+      this.inheritObject('_instanceAttributes', prototype, base);
+      // chain our event delegates map to the inherited version
+      this.inheritObject('eventDelegates', prototype, base);
+    },
+
+    // implement various declarative features
+    desugarAfterChaining: function(name, extendee) {
+      // build side-chained lists to optimize iterations
+      this.optimizePropertyMaps(this.prototype);
+      // install external stylesheets as if they are inline
+      this.installSheets();
+      // adjust any paths in dom from imports
+      this.resolveElementPaths(this);
+      // compile list of attributes to copy to instances
+      this.accumulateInstanceAttributes();
+      // parse on-* delegates declared on `this` element
+      this.parseHostEvents();
+      //
+      // install a helper method this.resolvePath to aid in 
+      // setting resource urls. e.g.
+      // this.$.image.src = this.resolvePath('images/foo.png')
+      this.addResolvePathApi();
+      // under ShadowDOMPolyfill, transforms to approximate missing CSS features
+      if (window.ShadowDOMPolyfill) {
+        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);
+      }
+      // allow custom element access to the declarative context
+      if (this.prototype.registerCallback) {
+        this.prototype.registerCallback(this);
+      }
+    },
+
+    // if a named constructor is requested in element, map a reference
+    // to the constructor to the given symbol
+    publishConstructor: function() {
+      var symbol = this.getAttribute('constructor');
+      if (symbol) {
+        window[symbol] = this.ctor;
+      }
+    },
+
+    // build prototype combining extendee, Polymer base, and named api
+    generateBasePrototype: function(extnds) {
+      var prototype = this.findBasePrototype(extnds);
+      if (!prototype) {
+        // create a prototype based on tag-name extension
+        var prototype = HTMLElement.getPrototypeForTag(extnds);
+        // insert base api in inheritance chain (if needed)
+        prototype = this.ensureBaseApi(prototype);
+        // memoize this base
+        memoizedBases[extnds] = prototype;
+      }
+      return prototype;
+    },
+
+    findBasePrototype: function(name) {
+      return memoizedBases[name];
+    },
+
+    // install Polymer instance api into prototype chain, as needed 
+    ensureBaseApi: function(prototype) {
+      if (prototype.PolymerBase) {
+        return prototype;
+      }
+      var extended = Object.create(prototype);
+      // we need a unique copy of base api for each base prototype
+      // therefore we 'extend' here instead of simply chaining
+      api.publish(api.instance, extended);
+      // TODO(sjmiles): sharing methods across prototype chains is
+      // not supported by 'super' implementation which optimizes
+      // by memoizing prototype relationships.
+      // Probably we should have a version of 'extend' that is 
+      // share-aware: it could study the text of each function,
+      // look for usage of 'super', and wrap those functions in
+      // closures.
+      // As of now, there is only one problematic method, so 
+      // we just patch it manually.
+      // To avoid re-entrancy problems, the special super method
+      // installed is called `mixinSuper` and the mixin method
+      // must use this method instead of the default `super`.
+      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
+      // return buffed-up prototype
+      return extended;
+    },
+
+    mixinMethod: function(extended, prototype, api, name) {
+      var $super = function(args) {
+        return prototype[name].apply(this, args);
+      };
+      extended[name] = function() {
+        this.mixinSuper = $super;
+        return api[name].apply(this, arguments);
+      }
+    },
+
+    // ensure prototype[name] inherits from a prototype.prototype[name]
+    inheritObject: function(name, prototype, base) {
+      // require an object
+      var source = prototype[name] || {};
+      // chain inherited properties onto a new object
+      prototype[name] = this.chainObject(source, base[name]);
+    },
+
+    // register 'prototype' to custom element 'name', store constructor 
+    registerPrototype: function(name, extendee) { 
+      var info = {
+        prototype: this.prototype
+      }
+      // native element must be specified in extends
+      var typeExtension = this.findTypeExtension(extendee);
+      if (typeExtension) {
+        info.extends = typeExtension;
+      }
+      // register the prototype with HTMLElement for name lookup
+      HTMLElement.register(name, this.prototype);
+      // register the custom type
+      this.ctor = document.registerElement(name, info);
+    },
+
+    findTypeExtension: function(name) {
+      if (name && name.indexOf('-') < 0) {
+        return name;
+      } else {
+        var p = this.findBasePrototype(name);
+        if (p.element) {
+          return this.findTypeExtension(p.element.extends);
+        }
+      }
+    }
+
+  };
+
+  // memoize base prototypes
+  var memoizedBases = {};
+
+  // implementation of 'chainObject' depends on support for __proto__
+  if (Object.__proto__) {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        object.__proto__ = inherited;
+      }
+      return object;
+    }
+  } else {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        var chained = Object.create(inherited);
+        object = extend(chained, object);
+      }
+      return object;
+    }
+  }
+
+  // On platforms that do not support __proto__ (versions of IE), the prototype
+  // chain of a custom element is simulated via installation of __proto__.
+  // Although custom elements manages this, we install it here so it's
+  // available during desugaring.
+  function ensurePrototypeTraversal(prototype) {
+    if (!Object.__proto__) {
+      var ancestor = Object.getPrototypeOf(prototype);
+      prototype.__proto__ = ancestor;
+      if (isBase(ancestor)) {
+        ancestor.__proto__ = Object.getPrototypeOf(ancestor);
+      }
+    }
+  }
+
+  // exports
+
+  api.declaration.prototype = prototype;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  var queue = {
+    // tell the queue to wait for an element to be ready
+    wait: function(element, check, go) {
+      if (this.indexOf(element) === -1) {
+        this.add(element);
+        element.__check = check;
+        element.__go = go;
+      }
+      return (this.indexOf(element) !== 0);
+    },
+    add: function(element) {
+      //console.log('queueing', element.name);
+      queueForElement(element).push(element);
+    },
+    indexOf: function(element) {
+      var i = queueForElement(element).indexOf(element);
+      if (i >= 0 && document.contains(element)) {
+        i += (HTMLImports.useNative || HTMLImports.ready) ? importQueue.length :
+            1e9;
+      }
+      return i;  
+    },
+    // tell the queue an element is ready to be registered
+    go: function(element) {
+      var readied = this.remove(element);
+      if (readied) {
+        readied.__go.call(readied);
+        readied.__check = readied.__go = null;
+        this.check();
+      }
+    },
+    remove: function(element) {
+      var i = this.indexOf(element);
+      if (i !== 0) {
+        //console.warn('queue order wrong', i);
+        return;
+      }
+      return queueForElement(element).shift();  
+    },
+    check: function() {
+      // next
+      var element = this.nextElement();
+      if (element) {
+        element.__check.call(element);
+      }
+      if (this.canReady()) {
+        this.ready();
+        return true;
+      }
+    },
+    nextElement: function() {
+      return nextQueued();
+    },
+    canReady: function() {
+      return !this.waitToReady && this.isEmpty();
+    },
+    isEmpty: function() {
+      return !importQueue.length && !mainQueue.length;
+    },
+    ready: function() {
+      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
+      // while registering. This way we avoid having to upgrade each document
+      // piecemeal per registration and can instead register all elements
+      // and upgrade once in a batch. Without this optimization, upgrade time
+      // degrades significantly when SD polyfill is used. This is mainly because
+      // querying the document tree for elements is slow under the SD polyfill.
+      if (CustomElements.ready === false) {
+        CustomElements.upgradeDocumentTree(document);
+        CustomElements.ready = true;
+      }
+      if (readyCallbacks) {
+        var fn;
+        while (readyCallbacks.length) {
+          fn = readyCallbacks.shift();
+          fn();
+        }
+      }
+    },
+    addReadyCallback: function(callback) {
+      if (callback) {
+        readyCallbacks.push(callback);
+      }
+    },
+    waitToReady: true
+  };
+
+  var importQueue = [];
+  var mainQueue = [];
+  var readyCallbacks = [];
+
+  function queueForElement(element) {
+    return document.contains(element) ? mainQueue : importQueue;
+  }
+
+  function nextQueued() {
+    return importQueue.length ? importQueue[0] : mainQueue[0];
+  }
+
+  var polymerReadied = false; 
+
+  document.addEventListener('WebComponentsReady', function() {
+    CustomElements.ready = false;
+  });
+  
+  function whenPolymerReady(callback) {
+    queue.waitToReady = true;
+    CustomElements.ready = false;
+    HTMLImports.whenImportsReady(function() {
+      queue.addReadyCallback(callback);
+      queue.waitToReady = false;
+      queue.check();
+    });
+  }
+
+  // exports
+  scope.queue = queue;
+  scope.whenPolymerReady = whenPolymerReady;
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  var whenPolymerReady = scope.whenPolymerReady;
+
+  function importElements(elementOrFragment, callback) {
+    if (elementOrFragment) {
+      document.head.appendChild(elementOrFragment);
+      whenPolymerReady(callback);
+    } else if (callback) {
+      callback();
+    }
+  }
+
+  function importUrls(urls, callback) {
+    if (urls && urls.length) {
+        var frag = document.createDocumentFragment();
+        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
+          link = document.createElement('link');
+          link.rel = 'import';
+          link.href = url;
+          frag.appendChild(link);
+        }
+        importElements(frag, callback);
+    } else if (callback) {
+      callback();
+    }
+  }
+
+  // exports
+  scope.import = importUrls;
+  scope.importElements = importElements;
+
+})(Polymer);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+  var queue = scope.queue;
+  var whenPolymerReady = scope.whenPolymerReady;
+  var getRegisteredPrototype = scope.getRegisteredPrototype;
+  var waitingForPrototype = scope.waitingForPrototype;
+
+  // declarative implementation: <polymer-element>
+
+  var prototype = extend(Object.create(HTMLElement.prototype), {
+
+    createdCallback: function() {
+      if (this.getAttribute('name')) {
+        this.init();
+      }
+    },
+
+    init: function() {
+      // fetch declared values
+      this.name = this.getAttribute('name');
+      this.extends = this.getAttribute('extends');
+      // initiate any async resource fetches
+      this.loadResources();
+      // register when all constraints are met
+      this.registerWhenReady();
+    },
+
+    registerWhenReady: function() {
+     if (this.registered
+       || this.waitingForPrototype(this.name)
+       || this.waitingForQueue()
+       || this.waitingForResources()) {
+          return;
+      }
+      queue.go(this);
+    },
+
+
+    // TODO(sorvell): refactor, this method is private-ish, but it's being
+    // called by the queue object.
+    _register: function() {
+      //console.log('registering', this.name);
+      //console.group('registering', this.name);
+      // warn if extending from a custom element not registered via Polymer
+      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {
+        console.warn('%s is attempting to extend %s, an unregistered element ' +
+            'or one that was not registered with Polymer.', this.name,
+            this.extends);
+      }
+      this.register(this.name, this.extends);
+      this.registered = true;
+      //console.groupEnd();
+    },
+
+    waitingForPrototype: function(name) {
+      if (!getRegisteredPrototype(name)) {
+        // then wait for a prototype
+        waitingForPrototype(name, this);
+        // emulate script if user is not supplying one
+        this.handleNoScript(name);
+        // prototype not ready yet
+        return true;
+      }
+    },
+
+    handleNoScript: function(name) {
+      // if explicitly marked as 'noscript'
+      if (this.hasAttribute('noscript') && !this.noscript) {
+        this.noscript = true;
+        // TODO(sorvell): CustomElements polyfill awareness:
+        // noscript elements should upgrade in logical order
+        // script injection ensures this under native custom elements;
+        // under imports + ce polyfills, scripts run before upgrades.
+        // dependencies should be ready at upgrade time so register
+        // prototype at this time.
+        if (window.CustomElements && !CustomElements.useNative) {
+          Polymer(name);
+        } else {
+          var script = document.createElement('script');
+          script.textContent = 'Polymer(\'' + name + '\');';
+          this.appendChild(script);
+        }
+      }
+    },
+
+    waitingForResources: function() {
+      return this._needsResources;
+    },
+
+    // NOTE: Elements must be queued in proper order for inheritance/composition
+    // dependency resolution. Previously this was enforced for inheritance,
+    // and by rule for composition. It's now entirely by rule.
+    waitingForQueue: function() {
+      return queue.wait(this, this.registerWhenReady, this._register);
+    },
+
+    loadResources: function() {
+      this._needsResources = true;
+      this.loadStyles(function() {
+        this._needsResources = false;
+        this.registerWhenReady();
+      }.bind(this));
+    }
+
+  });
+
+  // semi-pluggable APIs 
+
+  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
+  // the various plugins are allowed to depend on each other directly)
+  api.publish(api.declaration, prototype);
+
+  // utility and bookkeeping
+
+  function isRegistered(name) {
+    return Boolean(HTMLElement.getPrototypeForTag(name));
+  }
+
+  function isCustomTag(name) {
+    return (name && name.indexOf('-') >= 0);
+  }
+
+  // exports
+
+  scope.getRegisteredPrototype = getRegisteredPrototype;
+  
+  // boot tasks
+
+  whenPolymerReady(function() {
+    document.body.removeAttribute('unresolved');
+    document.dispatchEvent(
+      new CustomEvent('polymer-ready', {bubbles: true})
+    );
+  });
+
+  // register polymer-element with document
+
+  document.registerElement('polymer-element', {prototype: prototype});
+
+})(Polymer);
+
+//# sourceMappingURL=polymer.concat.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
new file mode 100644
index 0000000..2e5ebdb
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -0,0 +1,60 @@
+{
+  "version": 3,
+  "file": "polymer.concat.js",
+  "sources": [
+    "src/polymer.js",
+    "src/boot.js",
+    "src/lib/lang.js",
+    "src/lib/job.js",
+    "src/lib/dom.js",
+    "src/lib/super.js",
+    "src/lib/deserialize.js",
+    "src/api.js",
+    "src/instance/utils.js",
+    "src/instance/events.js",
+    "src/instance/attributes.js",
+    "src/instance/properties.js",
+    "src/instance/mdv.js",
+    "src/instance/base.js",
+    "src/instance/styles.js",
+    "src/declaration/polymer.js",
+    "src/declaration/path.js",
+    "src/declaration/styles.js",
+    "src/declaration/events.js",
+    "src/declaration/properties.js",
+    "src/declaration/attributes.js",
+    "src/declaration/prototype.js",
+    "src/declaration/queue.js",
+    "src/declaration/import.js",
+    "src/declaration/polymer-element.js"
+  ],
+  "names": [],
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,Y;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "sourcesContent": [
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nPolymer = {};\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n",
+    "/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n (function(scope) {\n    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\n",
+    "/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  }\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : 1 / handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 1) {\n        cancelAnimationFrame(Math.round(1 / handle));\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n",
+    "/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var properties = {\n    observeProperties: function() {\n      var n$ = this._observeNames, pn$ = this._publishNames;\n      if ((n$ && n$.length) || (pn$ && pn$.length)) {\n        var self = this;\n        var o = this._propertyObserver = new CompoundObserver();\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          // observer array properties\n          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);\n          if (pd && pd.value) {\n            this.observeArrayValue(n, pd.value, null);\n          }\n        }\n        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {\n          if (!this.observe || (this.observe[n] === undefined)) {\n            o.addPath(this, n);\n          }\n        }\n        o.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        if (this.publish[name] !== undefined) {\n          this.reflectPropertyToAttribute(name);\n        }\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.unregisterObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable) {\n      // apply Polymer two-way reference binding\n      return bindProperties(this, property, observable);\n    },\n    unbindAllProperties: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.close();\n      }\n      this.unregisterObservers();\n    },\n    unbindProperty: function(name) {\n      return this.unregisterObserver(name);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    // bookkeeping observers for memory management\n    registerObserver: function(name, observer) {\n      var o$ = this._observers || (this._observers = {});\n      o$[name] = observer;\n    },\n    unregisterObserver: function(name) {\n      var o$ = this._observers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    unregisterObservers: function() {\n      if (this._observers) {\n        var keys=Object.keys(this._observers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._observers[k];\n          o.close();\n        }\n        this._observers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);\n    // capture A's value if B's value is null or undefined,\n    // otherwise use B's value\n    // TODO(sorvell): need to review, can do with ObserverTransform\n    var v = observable.discardChanges();\n    if (v === null || v === undefined) {\n      observable.setValue(inA[inProperty]);\n    }\n    return Observer.defineComputedProperty(inA, inProperty, observable);\n  }\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n  var events = scope.api.instance.events;\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  }\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  };\n\n  // element api supporting mdv\n\n  var mdv = {\n    syntax: syntax,\n    instanceTemplate: function(template) {\n      return template.createInstance(this, this.syntax);\n    },\n    bind: function(name, observable, oneTime) {\n      // note: binding is a prepare signal. This allows us to be sure that any\n      // property changes that occur as a result of binding will be observed.\n      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // clean out the closets\n        this.unbind(name);\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable);\n        // stick path on observer so it's available via this.bindings\n        observer.path = observable.path_;\n        // reflect bound property to attribute when binding\n        // to ensure binding is not left on attribute if property\n        // does not update due to not changing.\n        this.reflectPropertyToAttribute(property);\n        return this.bindings[name] = observer;\n      }\n    },\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.unbindAllProperties();\n        this.super();\n        // unbind shadowRoot\n        var root = this.shadowRoot;\n        while (root) {\n          unbindNodeTree(root);\n          root = root.olderShadowRoot;\n        }\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function(preventCascade) {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n      // cancel unbinding our shadow tree iff we're not in the process of\n      // cascading our tree (as we do, for example, when the element is inserted).\n      if (!preventCascade) {\n        forNodeTree(this.shadowRoot, function(n) {\n          if (n.cancelUnbindAll) {\n            n.cancelUnbindAll();\n          }\n        });\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n  var preparingElements = 0;\n\n  var base = {\n    PolymerBase: true,\n    job: Polymer.job,\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      this.created();\n      if (this.ownerDocument.defaultView || this.alwaysPrepare ||\n          preparingElements > 0) {\n        this.prepareElement();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\n      // install property observers\n      this.observeProperties();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n      // guarantees that while preparing, any\n      // sub-elements are also prepared\n      preparingElements++;\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // decrement semaphore\n      preparingElements--;\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\n      this.cancelUnbindAll(true);\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants, \n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;        \n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // migrate flag(s)\n        root.resetStyleInheritance = this.resetStyleInheritance;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template) {\n      if (template) {\n        // TODO(sorvell): mark this element as a lightDOMController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants \n        // should be handled by this element.\n        this.lightDomController = true;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        this.appendChild(dom);\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this, template);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root, template) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up pointer gestures\n      PointerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase') \n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n  \n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n  \n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction. Note, this incurs a \n     * per instance cost and should be used sparingly.\n     *\n     * The need for this type of styling should go away when the shadowDOM spec\n     * addresses these issues:\n     * \n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389\n     * \n     * @param element The custom element instance into whose controller (parent)\n     * scope styles will be installed.\n     * @param elementElement The <element> containing controller styles.\n    */\n    // TODO(sorvell): remove when spec issues are addressed\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleController();\n      if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          var style = this.element.cssTextToScopeStyle(cssText,\n              STYLE_CONTROLLER_SCOPE);\n          // TODO(sorvell): for now these styles are not shimmed\n          // but we may need to shim them\n          Polymer.applyStyleToScope(style, scope);\n        }\n      }\n    },\n    findStyleController: function() {\n      if (window.ShadowDOMPolyfill) {\n        return wrap(document.head);\n      } else {\n        // find the shadow root that contains this element\n        var n = this;\n        while (n.parentNode) {\n          n = n.parentNode;\n        }\n        return n === document ? document.head : n;\n      }\n    },\n    scopeHasElementStyle: function(scope, descriptor) {\n      var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;\n      return scope.querySelector('style[' + rule + ']');\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n",
+    "/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'src') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    // TODO(sorvell): wip... caching and styles handling can probably be removed\n    // We need a scheme to ensure stylesheets are eagerly loaded without \n    // the creation of an element instance. Here are 2 options for handling this:\n    // 1. create a dummy element with ShadowDOM in dom that includes ALL styles\n    // processed here.\n    // 2. place stylesheets outside the element template. This will allow \n    // imports to naturally load the sheets. Then at load time, we can remove\n    // the stylesheet from dom.\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    templateContent: function() {\n      var template = this.querySelector('template');\n      return template && templateContent(template);\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';'\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      scope.appendChild(clone);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var events = { \n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n          //a.push(n);\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    requireProperties: function(properties, prototype, base) {\n      // ensure a prototype value for each property\n      for (var n in properties) {\n        if (prototype[n] === undefined && base[n] === undefined) {\n          prototype[n] = properties[n];\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            publish[n] = null;\n          }\n        }\n      }\n    },\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? importQueue.length :\n            1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();  \n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  \n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n"
+  ]
+}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.html b/pkg/polymer/lib/src/js/polymer/polymer.html
new file mode 100644
index 0000000..ae23866
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer.html
@@ -0,0 +1,8 @@
+<!--
+ Copyright 2013 The Polymer Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file.
+-->
+<script src="polymer.js"></script>
+<!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+<link rel="import" href="polymer-body.html">
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
new file mode 100644
index 0000000..e03efb2
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -0,0 +1,33 @@
+/**
+ * @license
+ * Copyright (c) 2012-2014 The Polymer Authors. All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *    * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *    * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *    * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+// @version: 0.2.0-e6f6d2b
+Polymer={},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var c=b.caller,g=c.nom,h=c._super;if(h||(g||(g=c.nom=e.call(this,c)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(c,g,f(this))),h){var i=h[g];return i._super||d(i,g,h),i.apply(this,a||[])}}function c(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}}function d(a,b,d){return a._super=c(d,b,a),a._super&&(a._super[b].nom=b),a._super}function e(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:1/e},cancelAsync:function(a){1>a?cancelAnimationFrame(Math.round(1/a)):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);var d,e,f=this;for(var g in a)e=c+g,(d=PolymerExpressions.prepareEventBinding(Path.get(a[g]),e,{resolveEventHandler:function(a,b){var c=b.getValueFrom(f);return c?c.bind(f):void 0}}))(this,this,!1)},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b,d){c.bind&&console.log(e,inB.localName||"object",inPath,a.localName,b);var f=d.discardChanges();return(null===f||void 0===f)&&d.setValue(a[b]),Observer.defineComputedProperty(a,b,d)}var c=window.logFlags||{},d={observeProperties:function(){var a=this._observeNames,b=this._publishNames;if(a&&a.length||b&&b.length){for(var c,d=this._propertyObserver=new CompoundObserver,e=0,f=a.length;f>e&&(c=a[e]);e++){d.addPath(this,c);var g=Object.getOwnPropertyDescriptor(this.__proto__,c);g&&g.value&&this.observeArrayValue(c,g.value,null)}for(var c,e=0,f=b.length;f>e&&(c=b[e]);e++)this.observe&&void 0!==this.observe[c]||d.addPath(this,c);d.open(this.notifyPropertyChanges,this)}},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)d=c[2*g+1],void 0!==this.publish[d]&&this.reflectPropertyToAttribute(d),e=this.observe[d],e&&(this.observeArrayValue(d,a[g],b[g]),f[e]||(f[e]=!0,this.invokeMethod(e,[b[g],a[g],arguments])))},observeArrayValue:function(a,b,d){var e=this.observe[a];if(e&&(Array.isArray(d)&&(c.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.unregisterObserver(a+"__array")),Array.isArray(b))){c.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerObserver(a+"__array",f)}},bindProperty:function(a,c){return b(this,a,c)},unbindAllProperties:function(){this._propertyObserver&&this._propertyObserver.close(),this.unregisterObservers()},unbindProperty:function(a){return this.unregisterObserver(a)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a,b){var c=this._observers||(this._observers={});c[a]=b},unregisterObserver:function(a){var b=this._observers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},unregisterObservers:function(){if(this._observers){for(var a,b,c=Object.keys(this._observers),d=0,e=c.length;e>d&&(a=c[d]);d++)b=this._observers[a],b.close();this._observers={}}}},e="[%s]: bindProperties: [%s] to [%s].[%s]";a.api.instance.properties=d}(Polymer),function(a){function b(a){for(;a.parentNode;){if(a.lightDomController)return a;a=a.parentNode}return a.host}function c(a){e(a,d)}function d(a){a.unbindAll()}function e(a,b){if(a){b(a);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}}var f=window.logFlags||0,g=(a.api.instance.events,new PolymerExpressions);g.resolveEventHandler=function(a,c,d){var e=b(d);if(e){var f=c.getValueFrom(e);if(f)return f.bind(e)}};var h={syntax:g,instanceTemplate:function(a){return a.createInstance(this,this.syntax)},bind:function(a,b){this._elementPrepared||this.prepareElement();var c=this.propertyForAttribute(a);if(c){this.unbind(a);var d=this.bindProperty(c,b);return d.path=b.path_,this.reflectPropertyToAttribute(c),this.bindings[a]=d}return this.mixinSuper(arguments)},asyncUnbindAll:function(){this._unbound||(f.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){if(!this._unbound){this.unbindAllProperties(),this.super();for(var a=this.shadowRoot;a;)c(a),a=a.olderShadowRoot;this._unbound=!0}},cancelUnbindAll:function(a){return this._unbound?void(f.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(f.unbind&&console.log("[%s] cancelUnbindAll",this.localName),this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop()),void(a||e(this.shadowRoot,function(a){a.cancelUnbindAll&&a.cancelUnbindAll()})))}},i=/\{\{([^{}]*)}}/;a.bindPattern=i,a.api.instance.mdv=h}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d=0,e={PolymerBase:!0,job:Polymer.job,"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.created(),(this.ownerDocument.defaultView||this.alwaysPrepare||d>0)&&this.prepareElement()},prepareElement:function(){this._elementPrepared=!0,this.shadowRoots={},this.observeProperties(),this.copyInstanceAttributes(),this.takeAttributes(),this.addHostListeners(),d++,this.parseDeclarations(this.__proto__),d--,this.removeAttribute("unresolved"),this.ready()},attachedCallback:function(){this._elementPrepared||this.prepareElement(),this.cancelUnbindAll(!0),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot();b.resetStyleInheritance=this.resetStyleInheritance;var c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a){if(a){this.lightDomController=!0;var b=this.instanceTemplate(a);return this.appendChild(b),this.shadowRootReady(this,a),b}},shadowRootReady:function(a){this.marshalNodeReferences(a),PointerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=e,e.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=e}(Polymer),function(a){function b(a){return a.__proto__}var c=(window.logFlags||{},"element"),d="controller",e={STYLE_SCOPE_ATTRIBUTE:c,installControllerStyles:function(){var a=this.findStyleController();if(a&&!this.scopeHasElementStyle(a,d)){for(var c=b(this),e="";c&&c.element;)e+=c.element.cssTextForScope(d),c=b(c);if(e){var f=this.element.cssTextToScopeStyle(e,d);Polymer.applyStyleToScope(f,a)}}},findStyleController:function(){if(window.ShadowDOMPolyfill)return wrap(document.head);for(var a=this;a.parentNode;)a=a.parentNode;return a===document?document.head:a},scopeHasElementStyle:function(a,b){var d=c+"="+this.localName+"-"+b;return a.querySelector("style["+d+"]")}};a.api.instance.styles=e}(Polymer),function(a){function b(a,b){if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e),b.appendChild(c)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.templateContent();b&&this.convertSheetsToStyles(b);var c=this.findLoadableStyles(b);c.length?Platform.styleResolver.loadStyles(c,a):a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"src"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},templateContent:function(){var a=this.querySelector("template");return a&&templateContent(a)},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(e)}},e=c.length;a.api.declaration.events=d}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b,c){for(var d in a)void 0===b[d]&&void 0===c[d]&&(b[d]=a[d])},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)f=h[i].trim(),f&&void 0===g[f]&&void 0===d[f]&&(g[f]=null)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?g:f}function c(){return f.length?f[0]:g[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){return-1===this.indexOf(a)&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?f.length:1e9),c},go:function(a){var b=this.remove(a);b&&(b.__go.call(b),b.__check=b.__go=null,this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!f.length&&!g.length},ready:function(){if(CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),h)for(var a;h.length;)(a=h.shift())()},addReadyCallback:function(a){a&&h.push(a)},waitToReady:!0},f=[],g=[],h=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),a.getRegisteredPrototype=h,g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer);
+//# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
new file mode 100644
index 0000000..212884f
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"polymer.js","sources":["src/polymer.js","src/boot.js","src/lib/lang.js","src/lib/job.js","src/lib/dom.js","src/lib/super.js","src/lib/deserialize.js","src/api.js","src/instance/utils.js","src/instance/events.js","src/instance/attributes.js","src/instance/properties.js","src/instance/mdv.js","src/instance/base.js","src/instance/styles.js","src/declaration/polymer.js","src/declaration/path.js","src/declaration/styles.js","src/declaration/events.js","src/declaration/properties.js","src/declaration/attributes.js","src/declaration/prototype.js","src/declaration/queue.js","src/declaration/import.js","src/declaration/polymer-element.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nPolymer = {};\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n (function(scope) {\n    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\n","/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  }\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : 1 / handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 1) {\n        cancelAnimationFrame(Math.round(1 / handle));\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var properties = {\n    observeProperties: function() {\n      var n$ = this._observeNames, pn$ = this._publishNames;\n      if ((n$ && n$.length) || (pn$ && pn$.length)) {\n        var self = this;\n        var o = this._propertyObserver = new CompoundObserver();\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          // observer array properties\n          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);\n          if (pd && pd.value) {\n            this.observeArrayValue(n, pd.value, null);\n          }\n        }\n        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {\n          if (!this.observe || (this.observe[n] === undefined)) {\n            o.addPath(this, n);\n          }\n        }\n        o.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        if (this.publish[name] !== undefined) {\n          this.reflectPropertyToAttribute(name);\n        }\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.unregisterObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable) {\n      // apply Polymer two-way reference binding\n      return bindProperties(this, property, observable);\n    },\n    unbindAllProperties: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.close();\n      }\n      this.unregisterObservers();\n    },\n    unbindProperty: function(name) {\n      return this.unregisterObserver(name);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    // bookkeeping observers for memory management\n    registerObserver: function(name, observer) {\n      var o$ = this._observers || (this._observers = {});\n      o$[name] = observer;\n    },\n    unregisterObserver: function(name) {\n      var o$ = this._observers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    unregisterObservers: function() {\n      if (this._observers) {\n        var keys=Object.keys(this._observers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._observers[k];\n          o.close();\n        }\n        this._observers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);\n    // capture A's value if B's value is null or undefined,\n    // otherwise use B's value\n    // TODO(sorvell): need to review, can do with ObserverTransform\n    var v = observable.discardChanges();\n    if (v === null || v === undefined) {\n      observable.setValue(inA[inProperty]);\n    }\n    return Observer.defineComputedProperty(inA, inProperty, observable);\n  }\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n  var events = scope.api.instance.events;\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  }\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  };\n\n  // element api supporting mdv\n\n  var mdv = {\n    syntax: syntax,\n    instanceTemplate: function(template) {\n      return template.createInstance(this, this.syntax);\n    },\n    bind: function(name, observable, oneTime) {\n      // note: binding is a prepare signal. This allows us to be sure that any\n      // property changes that occur as a result of binding will be observed.\n      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // clean out the closets\n        this.unbind(name);\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable);\n        // stick path on observer so it's available via this.bindings\n        observer.path = observable.path_;\n        // reflect bound property to attribute when binding\n        // to ensure binding is not left on attribute if property\n        // does not update due to not changing.\n        this.reflectPropertyToAttribute(property);\n        return this.bindings[name] = observer;\n      }\n    },\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.unbindAllProperties();\n        this.super();\n        // unbind shadowRoot\n        var root = this.shadowRoot;\n        while (root) {\n          unbindNodeTree(root);\n          root = root.olderShadowRoot;\n        }\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function(preventCascade) {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n      // cancel unbinding our shadow tree iff we're not in the process of\n      // cascading our tree (as we do, for example, when the element is inserted).\n      if (!preventCascade) {\n        forNodeTree(this.shadowRoot, function(n) {\n          if (n.cancelUnbindAll) {\n            n.cancelUnbindAll();\n          }\n        });\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n  var preparingElements = 0;\n\n  var base = {\n    PolymerBase: true,\n    job: Polymer.job,\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      this.created();\n      if (this.ownerDocument.defaultView || this.alwaysPrepare ||\n          preparingElements > 0) {\n        this.prepareElement();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\n      // install property observers\n      this.observeProperties();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n      // guarantees that while preparing, any\n      // sub-elements are also prepared\n      preparingElements++;\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // decrement semaphore\n      preparingElements--;\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\n      this.cancelUnbindAll(true);\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants, \n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;        \n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // migrate flag(s)\n        root.resetStyleInheritance = this.resetStyleInheritance;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template) {\n      if (template) {\n        // TODO(sorvell): mark this element as a lightDOMController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants \n        // should be handled by this element.\n        this.lightDomController = true;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        this.appendChild(dom);\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this, template);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root, template) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up pointer gestures\n      PointerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase') \n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n  \n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction. Note, this incurs a \n     * per instance cost and should be used sparingly.\n     *\n     * The need for this type of styling should go away when the shadowDOM spec\n     * addresses these issues:\n     * \n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389\n     * \n     * @param element The custom element instance into whose controller (parent)\n     * scope styles will be installed.\n     * @param elementElement The <element> containing controller styles.\n    */\n    // TODO(sorvell): remove when spec issues are addressed\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleController();\n      if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          var style = this.element.cssTextToScopeStyle(cssText,\n              STYLE_CONTROLLER_SCOPE);\n          // TODO(sorvell): for now these styles are not shimmed\n          // but we may need to shim them\n          Polymer.applyStyleToScope(style, scope);\n        }\n      }\n    },\n    findStyleController: function() {\n      if (window.ShadowDOMPolyfill) {\n        return wrap(document.head);\n      } else {\n        // find the shadow root that contains this element\n        var n = this;\n        while (n.parentNode) {\n          n = n.parentNode;\n        }\n        return n === document ? document.head : n;\n      }\n    },\n    scopeHasElementStyle: function(scope, descriptor) {\n      var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;\n      return scope.querySelector('style[' + rule + ']');\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'src') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    // TODO(sorvell): wip... caching and styles handling can probably be removed\n    // We need a scheme to ensure stylesheets are eagerly loaded without \n    // the creation of an element instance. Here are 2 options for handling this:\n    // 1. create a dummy element with ShadowDOM in dom that includes ALL styles\n    // processed here.\n    // 2. place stylesheets outside the element template. This will allow \n    // imports to naturally load the sheets. Then at load time, we can remove\n    // the stylesheet from dom.\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    templateContent: function() {\n      var template = this.querySelector('template');\n      return template && templateContent(template);\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';'\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      scope.appendChild(clone);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var events = { \n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n          //a.push(n);\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    requireProperties: function(properties, prototype, base) {\n      // ensure a prototype value for each property\n      for (var n in properties) {\n        if (prototype[n] === undefined && base[n] === undefined) {\n          prototype[n] = properties[n];\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            publish[n] = null;\n          }\n        }\n      }\n    },\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? importQueue.length :\n            1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();  \n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  \n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n"]}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js b/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
new file mode 100644
index 0000000..c2f51c1
--- /dev/null
+++ b/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
@@ -0,0 +1,10 @@
+// Prevent polyfilled JS Shadow DOM in Dartium
+// We need this if we want Dart code to be able to interoperate with Polymer.js
+// code that also uses Shadow DOM.
+// TODO(jmesserly): we can remove this code once platform.js is correctly
+// feature detecting Shadow DOM in Dartium.
+if (navigator.userAgent.indexOf('(Dart)') !== -1) {
+  window.Platform = window.Platform || {};
+  Platform.flags = Platform.flags || {};
+  Platform.flags.shadow = 'native';
+}
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index e6f17f5..54533c9 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -12,7 +12,13 @@
 
 /// Metadata used to label static or top-level methods that are called
 /// automatically when loading the library of a custom element.
-const initMethod = const _InitMethodAnnotation();
+const initMethod = const InitMethodAnnotation();
+
+/// Implementation behind [initMethod]. Only exposed for internal implementation
+/// details
+class InitMethodAnnotation {
+  const InitMethodAnnotation();
+}
 
 /// Initializes a polymer application as follows:
 ///   * set up up polling for observable changes
@@ -22,44 +28,22 @@
 ///   register custom elements declared there (labeled with [CustomTag]) and
 ///   invoke the initialization method on it (top-level functions annotated with
 ///   [initMethod]).
-Zone initPolymer() {
-  // We use this pattern, and not the inline lazy initialization pattern, so we
-  // can help dart2js detect that _discoverInitializers can be tree-shaken for
-  // deployment (and hence all uses of dart:mirrors from this loading logic).
-  // TODO(sigmund): fix polymer's transformers so they can replace initPolymer
-  // by initPolymerOptimized.
-  if (_initializers == null) _initializers = _discoverInitializers();
-
+Zone initPolymer() => loader.deployMode
   // In deployment mode, we rely on change notifiers instead of dirty checking.
-  if (!_deployMode) {
-    return dirtyCheckZone()..run(initPolymerOptimized);
-  }
-
-  return initPolymerOptimized();
-}
+    ? _initPolymerOptimized() : (dirtyCheckZone()..run(_initPolymerOptimized));
 
 /// Same as [initPolymer], but runs the version that is optimized for deployment
 /// to the internet. The biggest difference is it omits the [Zone] that
 /// automatically invokes [Observable.dirtyCheck], and the list of initializers
 /// must be supplied instead of being dynamically searched for at runtime using
 /// mirrors.
-Zone initPolymerOptimized() {
-  // TODO(sigmund): refactor this so we can replace it by codegen.
-  smoke.useMirrors();
-  // TODO(jmesserly): there is some code in src/declaration/polymer-element.js,
-  // git version 37eea00e13b9f86ab21c85a955585e8e4237e3d2, right before
-  // it registers polymer-element, which uses Platform.deliverDeclarations to
-  // coordinate with HTML Imports. I don't think we need it so skipping.
-  document.register(PolymerDeclaration._TAG, PolymerDeclaration);
+Zone _initPolymerOptimized() {
+  _hookJsPolymer();
 
-  for (var initializer in _initializers) {
+  for (var initializer in loader.initializers) {
     initializer();
   }
 
-  // Run this after user code so they can add to Polymer.veiledElements
-  _preventFlashOfUnstyledContent();
-
-  customElementsReady.then((_) => Polymer._ready.complete());
   return Zone.current;
 }
 
@@ -68,167 +52,62 @@
 /// at runtime. Additionally, after this method is called [initPolymer] omits
 /// the [Zone] that automatically invokes [Observable.dirtyCheck].
 void configureForDeployment(List<Function> initializers) {
-  _initializers = initializers;
-  _deployMode = true;
+  loader.initializers = initializers;
+  loader.deployMode = true;
 }
 
-/// List of initializers that by default will be executed when calling
-/// initPolymer. If null, initPolymer will compute the list of initializers by
-/// crawling HTML imports, searchfing for script tags, and including an
-/// initializer for each type tagged with a [CustomTag] annotation and for each
-/// top-level method annotated with [initMethod]. The value of this field is
-/// assigned programatically by the code generated from the polymer deploy
-/// scripts.
-List<Function> _initializers;
-
-/// True if we're in deployment mode.
-bool _deployMode = false;
-
-List<Function> _discoverInitializers() {
-  var initializers = [];
-  var librariesToLoad = _discoverScripts(document, window.location.href);
-  for (var lib in librariesToLoad) {
-    try {
-      _loadLibrary(lib, initializers);
-    } catch (e, s) {
-      // Deliver errors async, so if a single library fails it doesn't prevent
-      // other things from loading.
-      new Completer().completeError(e, s);
-    }
-  }
-  return initializers;
-}
-
-/// Walks the HTML import structure to discover all script tags that are
-/// implicitly loaded. This code is only used in Dartium and should only be
-/// called after all HTML imports are resolved. Polymer ensures this by asking
-/// users to put their Dart script tags after all HTML imports (this is checked
-/// by the linter, and Dartium will otherwise show an error message).
-List<String> _discoverScripts(Document doc, String baseUri,
-    [Set<Document> seen, List<String> scripts]) {
-  if (seen == null) seen = new Set<Document>();
-  if (scripts == null) scripts = <String>[];
-  if (doc == null) {
-    print('warning: $baseUri not found.');
-    return scripts;
-  }
-  if (seen.contains(doc)) return scripts;
-  seen.add(doc);
-
-  bool scriptSeen = false;
-  for (var node in doc.querySelectorAll('script,link[rel="import"]')) {
-    if (node is LinkElement) {
-      _discoverScripts(node.import, node.href, seen, scripts);
-    } else if (node is ScriptElement && node.type == 'application/dart') {
-      if (!scriptSeen) {
-        var url = node.src;
-        scripts.add(url == '' ? baseUri : url);
-        scriptSeen = true;
-      } else {
-        print('warning: more than one Dart script tag in $baseUri. Dartium '
-            'currently only allows a single Dart script tag per document.');
-      }
-    }
-  }
-  return scripts;
-}
-
-/// All libraries in the current isolate.
-final _libs = currentMirrorSystem().libraries;
-
-// TODO(sigmund): explore other (cheaper) ways to resolve URIs relative to the
-// root library (see dartbug.com/12612)
-final _rootUri = currentMirrorSystem().isolate.rootLibrary.uri;
-
-final Logger _loaderLog = new Logger('polymer.loader');
-
-bool _isHttpStylePackageUrl(Uri uri) {
-  var uriPath = uri.path;
-  return uri.scheme == _rootUri.scheme &&
-      // Don't process cross-domain uris.
-      uri.authority == _rootUri.authority &&
-      uriPath.endsWith('.dart') &&
-      (uriPath.contains('/packages/') || uriPath.startsWith('packages/'));
-}
-
-/// Reads the library at [uriString] (which can be an absolute URI or a relative
-/// URI from the root library), and:
+/// To ensure Dart can interoperate with polymer-element registered by
+/// polymer.js, we need to be able to execute Dart code if we are registering
+/// a Dart class for that element. We trigger Dart logic by patching
+/// polymer-element's register function and:
 ///
-///   * If present, invokes any top-level and static functions marked
-///     with the [initMethod] annotation (in the order they appear).
-///
-///   * Registers any [PolymerElement] that is marked with the [CustomTag]
-///     annotation.
-void _loadLibrary(String uriString, List<Function> initializers) {
-  var uri = _rootUri.resolve(uriString);
-  var lib = _libs[uri];
-  if (_isHttpStylePackageUrl(uri)) {
-    // Use package: urls if available. This rule here is more permissive than
-    // how we translate urls in polymer-build, but we expect Dartium to limit
-    // the cases where there are differences. The polymer-build issues an error
-    // when using packages/ inside lib without properly stepping out all the way
-    // to the packages folder. If users don't create symlinks in the source
-    // tree, then Dartium will also complain because it won't find the file seen
-    // in an HTML import.
-    var packagePath = uri.path.substring(
-        uri.path.lastIndexOf('packages/') + 'packages/'.length);
-    var canonicalLib = _libs[Uri.parse('package:$packagePath')];
-    if (canonicalLib != null) {
-      lib = canonicalLib;
+/// * if it has a Dart class, run PolymerDeclaration's register.
+/// * otherwise it is a JS prototype, run polymer-element's normal register.
+void _hookJsPolymer() {
+  var polymerJs = js.context['Polymer'];
+  if (polymerJs == null) {
+    throw new StateError('polymer.js must be loaded before polymer.dart, please'
+        ' add <link rel="import" href="packages/polymer/polymer.html"> to your'
+        ' <head> before any Dart scripts. Alternatively you can get a different'
+        ' version of polymer.js by following the instructions at'
+        ' http://www.polymer-project.org; if you do that be sure to include'
+        ' the platform polyfills.');
+  }
+
+  // TODO(jmesserly): dart:js appears to not callback in the correct zone:
+  // https://code.google.com/p/dart/issues/detail?id=17301
+  var zone = Zone.current;
+
+  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);
+  }
+
+  JsFunction originalRegister = proto['register'];
+  if (originalRegister == null) {
+    throw new StateError('polymer.js must expose "register" function on '
+        'polymer-element to enable polymer.dart to interoperate.');
+  }
+
+  registerDart(jsElem, String name, String extendee) {
+    // By the time we get here, we'll know for sure if it is a Dart object
+    // or not, because polymer-element will wait for us to notify that
+    // the @CustomTag was found.
+    final type = _getRegisteredType(name);
+    if (type != null) {
+      final extendsDecl = _getDeclaration(extendee);
+      return zone.run(() =>
+          new PolymerDeclaration(jsElem, name, type, extendsDecl).register());
     }
+    // It's a JavaScript polymer element, fall back to the original register.
+    return originalRegister.apply([name, extendee], thisArg: jsElem);
   }
 
-  if (lib == null) {
-    _loaderLog.info('$uri library not found');
-    return;
-  }
-
-  // Search top-level functions marked with @initMethod
-  for (var f in lib.declarations.values.where((d) => d is MethodMirror)) {
-    _addInitMethod(lib, f, initializers);
-  }
-
-  for (var c in lib.declarations.values.where((d) => d is ClassMirror)) {
-    // Search for @CustomTag on classes
-    for (var m in c.metadata) {
-      var meta = m.reflectee;
-      if (meta is CustomTag) {
-        initializers.add(() => Polymer.register(meta.tagName, c.reflectedType));
-      }
-    }
-
-    // TODO(sigmund): check also static methods marked with @initMethod.
-    // This is blocked on two bugs:
-    //  - dartbug.com/12133 (static methods are incorrectly listed as top-level
-    //    in dart2js, so they end up being called twice)
-    //  - dartbug.com/12134 (sometimes "method.metadata" throws an exception,
-    //    we could wrap and hide those exceptions, but it's not ideal).
-  }
-}
-
-void _addInitMethod(ObjectMirror obj, MethodMirror method,
-    List<Function> initializers) {
-  var annotationFound = false;
-  for (var meta in method.metadata) {
-    if (identical(meta.reflectee, initMethod)) {
-      annotationFound = true;
-      break;
-    }
-  }
-  if (!annotationFound) return;
-  if (!method.isStatic) {
-    print("warning: methods marked with @initMethod should be static,"
-        " ${method.simpleName} is not.");
-    return;
-  }
-  if (!method.parameters.where((p) => !p.isOptional).isEmpty) {
-    print("warning: methods marked with @initMethod should take no "
-        "arguments, ${method.simpleName} expects some.");
-    return;
-  }
-  initializers.add(() => obj.invoke(method.simpleName, const []));
-}
-
-class _InitMethodAnnotation {
-  const _InitMethodAnnotation();
+  proto['register'] = new JsFunction.withThis(registerDart);
 }
diff --git a/pkg/polymer/lib/src/mirror_loader.dart b/pkg/polymer/lib/src/mirror_loader.dart
new file mode 100644
index 0000000..c450b83
--- /dev/null
+++ b/pkg/polymer/lib/src/mirror_loader.dart
@@ -0,0 +1,214 @@
+// 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.
+
+/// Contains logic to initialize polymer apps during development. This
+/// implementation uses dart:mirrors to load each library as they are discovered
+/// through HTML imports. This is only meant to be during development in
+/// dartium, and the polymer transformers replace this implementation with
+/// codege generation in the polymer-build steps.
+library polymer.src.mirror_loader;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:collection' show LinkedHashMap;
+
+// Technically, we shouldn't need any @MirrorsUsed, since this is for
+// development only, but our test bots don't yet run pub-build. See more details
+// on the comments of the mirrors import in `lib/polymer.dart`.
+@MirrorsUsed(metaTargets:
+    const [CustomTag, InitMethodAnnotation],
+    override: const ['smoke.mirrors', 'polymer.src.mirror_loader'])
+import 'dart:mirrors';
+
+import 'package:logging/logging.dart' show Logger;
+import 'package:polymer/polymer.dart' show
+    InitMethodAnnotation, CustomTag, initMethod, Polymer;
+
+
+/// Set of initializers that are invoked by `initPolymer`.  This is computed the
+/// list by crawling HTML imports, searching for script tags, and including an
+/// initializer for each type tagged with a [CustomTag] annotation and for each
+/// top-level method annotated with [initMethod].
+List<Function> initializers = _discoverInitializers();
+
+/// True if we're in deployment mode.
+bool deployMode = false;
+
+/// Discovers what script tags are loaded from HTML pages and collects the
+/// initializers of their corresponding libraries.
+List<Function> _discoverInitializers() {
+  var initializers = [];
+  var librariesToLoad = _discoverScripts(document, window.location.href);
+  for (var lib in librariesToLoad) {
+    try {
+      _loadLibrary(lib, initializers);
+    } catch (e, s) {
+      // Deliver errors async, so if a single library fails it doesn't prevent
+      // other things from loading.
+      new Completer().completeError(e, s);
+    }
+  }
+  return initializers;
+}
+
+/// Walks the HTML import structure to discover all script tags that are
+/// implicitly loaded. This code is only used in Dartium and should only be
+/// called after all HTML imports are resolved. Polymer ensures this by asking
+/// users to put their Dart script tags after all HTML imports (this is checked
+/// by the linter, and Dartium will otherwise show an error message).
+List<String> _discoverScripts(Document doc, String baseUri,
+    [Set<Document> seen, List<String> scripts]) {
+  if (seen == null) seen = new Set<Document>();
+  if (scripts == null) scripts = <String>[];
+  if (doc == null) {
+    print('warning: $baseUri not found.');
+    return scripts;
+  }
+  if (seen.contains(doc)) return scripts;
+  seen.add(doc);
+
+  bool scriptSeen = false;
+  for (var node in doc.querySelectorAll('script,link[rel="import"]')) {
+    if (node is LinkElement) {
+      _discoverScripts(node.import, node.href, seen, scripts);
+    } else if (node is ScriptElement && node.type == 'application/dart') {
+      if (!scriptSeen) {
+        var url = node.src;
+        scripts.add(url == '' ? baseUri : url);
+        scriptSeen = true;
+      } else {
+        print('warning: more than one Dart script tag in $baseUri. Dartium '
+            'currently only allows a single Dart script tag per document.');
+      }
+    }
+  }
+  return scripts;
+}
+
+/// All libraries in the current isolate.
+final _libs = currentMirrorSystem().libraries;
+
+// TODO(sigmund): explore other (cheaper) ways to resolve URIs relative to the
+// root library (see dartbug.com/12612)
+final _rootUri = currentMirrorSystem().isolate.rootLibrary.uri;
+
+final Logger _loaderLog = new Logger('polymer.src.mirror_loader');
+
+bool _isHttpStylePackageUrl(Uri uri) {
+  var uriPath = uri.path;
+  return uri.scheme == _rootUri.scheme &&
+      // Don't process cross-domain uris.
+      uri.authority == _rootUri.authority &&
+      uriPath.endsWith('.dart') &&
+      (uriPath.contains('/packages/') || uriPath.startsWith('packages/'));
+}
+
+/// Reads the library at [uriString] (which can be an absolute URI or a relative
+/// URI from the root library), and:
+///
+///   * If present, invokes any top-level and static functions marked
+///     with the [initMethod] annotation (in the order they appear).
+///
+///   * Registers any [PolymerElement] that is marked with the [CustomTag]
+///     annotation.
+void _loadLibrary(String uriString, List<Function> initializers) {
+  var uri = _rootUri.resolve(uriString);
+  var lib = _libs[uri];
+  if (_isHttpStylePackageUrl(uri)) {
+    // Use package: urls if available. This rule here is more permissive than
+    // how we translate urls in polymer-build, but we expect Dartium to limit
+    // the cases where there are differences. The polymer-build issues an error
+    // when using packages/ inside lib without properly stepping out all the way
+    // to the packages folder. If users don't create symlinks in the source
+    // tree, then Dartium will also complain because it won't find the file seen
+    // in an HTML import.
+    var packagePath = uri.path.substring(
+        uri.path.lastIndexOf('packages/') + 'packages/'.length);
+    var canonicalLib = _libs[Uri.parse('package:$packagePath')];
+    if (canonicalLib != null) {
+      lib = canonicalLib;
+    }
+  }
+
+  if (lib == null) {
+    _loaderLog.info('$uri library not found');
+    return;
+  }
+
+  // Search top-level functions marked with @initMethod
+  for (var f in lib.declarations.values.where((d) => d is MethodMirror)) {
+    _addInitMethod(lib, f, initializers);
+  }
+
+
+  // Dart note: we don't get back @CustomTags in a reliable order from mirrors,
+  // at least on Dart VM. So we need to sort them so base classes are registered
+  // first, which ensures that document.register will work correctly for a
+  // set of types within in the same library.
+  var customTags = new LinkedHashMap<Type, Function>();
+  for (var c in lib.declarations.values.where((d) => d is ClassMirror)) {
+    _loadCustomTags(lib, c, customTags);
+    // TODO(sigmund): check also static methods marked with @initMethod.
+    // This is blocked on two bugs:
+    //  - dartbug.com/12133 (static methods are incorrectly listed as top-level
+    //    in dart2js, so they end up being called twice)
+    //  - dartbug.com/12134 (sometimes "method.metadata" throws an exception,
+    //    we could wrap and hide those exceptions, but it's not ideal).
+  }
+
+  initializers.addAll(customTags.values);
+}
+
+void _loadCustomTags(LibraryMirror lib, ClassMirror cls,
+    LinkedHashMap registerFns) {
+  if (cls == null || cls.reflectedType == HtmlElement) return;
+
+  // Register superclass first.
+  _loadCustomTags(lib, cls.superclass, registerFns);
+
+  if (cls.owner != lib) {
+    // Don't register classes from different libraries.
+    // TODO(jmesserly): @CustomTag does not currently respect re-export, because
+    // LibraryMirror.declarations doesn't include these.
+    return;
+  }
+
+  var meta = _getCustomTagMetadata(cls);
+  if (meta == null) return;
+
+  registerFns.putIfAbsent(cls.reflectedType, () =>
+      () => Polymer.register(meta.tagName, cls.reflectedType));
+}
+
+/// Search for @CustomTag on a classemirror
+CustomTag _getCustomTagMetadata(ClassMirror c) {
+  for (var m in c.metadata) {
+    var meta = m.reflectee;
+    if (meta is CustomTag) return meta;
+  }
+  return null;
+}
+
+void _addInitMethod(ObjectMirror obj, MethodMirror method,
+    List<Function> initializers) {
+  var annotationFound = false;
+  for (var meta in method.metadata) {
+    if (identical(meta.reflectee, initMethod)) {
+      annotationFound = true;
+      break;
+    }
+  }
+  if (!annotationFound) return;
+  if (!method.isStatic) {
+    print("warning: methods marked with @initMethod should be static,"
+        " ${method.simpleName} is not.");
+    return;
+  }
+  if (!method.parameters.where((p) => !p.isOptional).isEmpty) {
+    print("warning: methods marked with @initMethod should take no "
+        "arguments, ${method.simpleName} expects some.");
+    return;
+  }
+  initializers.add(() => obj.invoke(method.simpleName, const []));
+}
diff --git a/pkg/polymer/lib/src/static_loader.dart b/pkg/polymer/lib/src/static_loader.dart
new file mode 100644
index 0000000..cd926c1
--- /dev/null
+++ b/pkg/polymer/lib/src/static_loader.dart
@@ -0,0 +1,19 @@
+// 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.
+
+/// Alternative implementation for loading initializers that avoids using
+/// mirrors. Unlike `mirror_loader` this is used for deployed applications to
+/// avoid any dependence on the mirror system.
+library polymer.src.static_loader;
+
+/// Set of initializers that are invoked by `initPolymer`.  This is initialized
+/// with code automatically generated by the polymer transformers. The
+/// initialization code is injected in the entrypoint of the application.
+List<Function> initializers;
+
+/// True if we're in deployment mode.
+// TODO(sigmund): make this a const anda rem ove the assignment in
+// configureForDevelopment when our testing infrastructure supports calling pub
+// build.
+bool deployMode = true;
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index a18b691..05f6f56 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.0
+version: 0.10.0-pre.1
 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,7 +7,7 @@
   browsers.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.3"
+  analyzer: "0.13.0-dev.4"
   args: ">=0.10.0 <0.11.0"
   barback: ">=0.9.0 <0.13.0"
   browser: ">=0.10.0 <0.11.0"
@@ -19,11 +19,17 @@
   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.1 <0.4.0"
+  web_components: ">=0.3.2 <0.4.0"
   yaml: ">=0.9.0 <0.10.0"
 transformers:
+# TODO(sigmund): uncomment when full codegen is ready.
+#- polymer/src/build/remove_mirrors
+#    $include: lib/polymer.dart
 - observe:
     files: lib/src/instance.dart
+    # 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:
diff --git a/pkg/polymer/test/attr_deserialize_test.html b/pkg/polymer/test/attr_deserialize_test.html
index db516de..35ef320 100644
--- a/pkg/polymer/test/attr_deserialize_test.html
+++ b/pkg/polymer/test/attr_deserialize_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Polymer.dart attribute deserialization test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/attr_mustache_test.html b/pkg/polymer/test/attr_mustache_test.html
index f41a3d5..42c3b3d 100644
--- a/pkg/polymer/test/attr_mustache_test.html
+++ b/pkg/polymer/test/attr_mustache_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>take attributes</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/bind_mdv_test.html b/pkg/polymer/test/bind_mdv_test.html
index 444bf7e..2539932 100644
--- a/pkg/polymer/test/bind_mdv_test.html
+++ b/pkg/polymer/test/bind_mdv_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running bind_mdv_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/pkg/polymer/test/bind_test.html b/pkg/polymer/test/bind_test.html
index 6cd8640..7221cce 100644
--- a/pkg/polymer/test/bind_test.html
+++ b/pkg/polymer/test/bind_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>bind simple</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/custom_event_test.html b/pkg/polymer/test/custom_event_test.html
index a17553a..1e071cf 100644
--- a/pkg/polymer/test/custom_event_test.html
+++ b/pkg/polymer/test/custom_event_test.html
@@ -8,6 +8,7 @@
   <head>
     <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>custom events</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/entered_view_test.html b/pkg/polymer/test/entered_view_test.html
index a4437cf..d9e937d 100644
--- a/pkg/polymer/test/entered_view_test.html
+++ b/pkg/polymer/test/entered_view_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>enteredView binding test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/event_handlers_test.html b/pkg/polymer/test/event_handlers_test.html
index b09d3e5..94dc475 100644
--- a/pkg/polymer/test/event_handlers_test.html
+++ b/pkg/polymer/test/event_handlers_test.html
@@ -11,6 +11,7 @@
   -->
   <head>
     <title>event handlers</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/event_path_declarative_test.html b/pkg/polymer/test/event_path_declarative_test.html
index 94895fe..4fcc3d6 100644
--- a/pkg/polymer/test/event_path_declarative_test.html
+++ b/pkg/polymer/test/event_path_declarative_test.html
@@ -7,6 +7,7 @@
 <html>
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head><title>event path declarative test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
     <!--
     Test ported from:
diff --git a/pkg/polymer/test/event_path_test.html b/pkg/polymer/test/event_path_test.html
index 1250cf6..0372815 100644
--- a/pkg/polymer/test/event_path_test.html
+++ b/pkg/polymer/test/event_path_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>event path</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
     <!--
     Test ported from:
diff --git a/pkg/polymer/test/events_test.html b/pkg/polymer/test/events_test.html
index 2e5a952..bfee540 100644
--- a/pkg/polymer/test/events_test.html
+++ b/pkg/polymer/test/events_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>event path</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
     <!--
     Test ported from:
diff --git a/pkg/polymer/test/instance_attrs_test.html b/pkg/polymer/test/instance_attrs_test.html
index 40dc7ba..11832de 100644
--- a/pkg/polymer/test/instance_attrs_test.html
+++ b/pkg/polymer/test/instance_attrs_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Polymer.dart attribute deserialization test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart
new file mode 100644
index 0000000..3704ccb
--- /dev/null
+++ b/pkg/polymer/test/js_interop_test.dart
@@ -0,0 +1,71 @@
+// 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 polymer.test.web.js_interop_test;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:js';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/unittest.dart';
+
+@CustomTag("dart-element")
+class DartElement extends PolymerElement {
+  DartElement.created() : super.created();
+}
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('dart-element upgraded', () {
+    expect(querySelector('dart-element') is DartElement, true,
+        reason: 'dart-element upgraded');
+  });
+
+  test('js-element in body', () => testInterop(
+      querySelector('js-element')));
+
+  test('js-element in dart-element', () => testInterop(
+      querySelector('dart-element').shadowRoot.querySelector('js-element')));
+});
+
+testInterop(jsElem) {
+  expect(jsElem.shadowRoot.text, 'FOOBAR');
+  var interop = new JsObject.fromBrowserObject(jsElem);
+  expect(interop['baz'], 42, reason: 'can read JS custom element properties');
+
+  jsElem.attributes['baz'] = '123';
+  return flush().then((_) {
+    expect(interop['baz'], 123, reason: 'attribute reflected to property');
+    expect(jsElem.shadowRoot.text, 'FOOBAR', reason: 'text unchanged');
+
+    interop['baz'] = 777;
+    return flush();
+  }).then((_) {
+    expect(jsElem.attributes['baz'], '777',
+        reason: 'property reflected to attribute');
+
+    expect(jsElem.shadowRoot.text, 'FOOBAR', reason: 'text unchanged');
+
+    interop.callMethod('aJsMethod', [123]);
+    return flush();
+  }).then((_) {
+    expect(jsElem.shadowRoot.text, '900', reason: 'text set by JS method');
+    expect(interop['baz'], 777, reason: 'unchanged');
+  });
+}
+
+/// Calls Platform.flush() to flush Polymer.js pending operations, e.g.
+/// dirty checking for data-bindings.
+Future flush() {
+  var Platform = context['Platform'];
+  Platform.callMethod('flush');
+
+  var completer = new Completer();
+  Platform.callMethod('endOfMicrotask', [() => completer.complete()]);
+  return completer.future;
+}
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
new file mode 100644
index 0000000..dab9c5c
--- /dev/null
+++ b/pkg/polymer/test/js_interop_test.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<!--
+   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.
+-->
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>polymer.js interop test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+  <body>
+
+  <polymer-element name="js-element" attributes="baz">
+    <template>FOOBAR</template>
+    <script>
+    Polymer('js-element', {
+      baz: 42,
+      aJsMethod: function(inc) {
+        this.shadowRoot.textContent = this.baz + inc;
+      },
+    });
+    </script>
+  </polymer-element>
+
+  <polymer-element name="dart-element">
+    <template>
+      <js-element></js-element>
+    </template>
+  </polymer-element>
+
+  <dart-element></dart-element>
+  <js-element></js-element>
+
+  <script type="application/dart" src="js_interop_test.dart"></script>
+
+  </body>
+</html>
diff --git a/pkg/polymer/test/nested_binding_test.html b/pkg/polymer/test/nested_binding_test.html
index 39fb241..ffafdf1 100644
--- a/pkg/polymer/test/nested_binding_test.html
+++ b/pkg/polymer/test/nested_binding_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>nesting binding test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/noscript_test.dart b/pkg/polymer/test/noscript_test.dart
index bdbcb6f..06cec77 100644
--- a/pkg/polymer/test/noscript_test.dart
+++ b/pkg/polymer/test/noscript_test.dart
@@ -30,16 +30,9 @@
   setUp(() => ready);
 
   test('template found with multiple noscript declarations', () {
-    expect(querySelector('x-a') is PolymerElement, isTrue);
     expect(querySelector('x-a').shadowRoot.nodes.first.text, 'a');
-
-    expect(querySelector('x-c') is PolymerElement, isTrue);
     expect(querySelector('x-c').shadowRoot.nodes.first.text, 'c');
-
-    expect(querySelector('x-b') is PolymerElement, isTrue);
     expect(querySelector('x-b').shadowRoot.nodes.first.text, 'b');
-
-    expect(querySelector('x-d') is PolymerElement, isTrue);
     expect(querySelector('x-d').shadowRoot.nodes.first.text, 'd');
   });
 });
diff --git a/pkg/polymer/test/noscript_test.html b/pkg/polymer/test/noscript_test.html
index 0efadb0..652cc7f 100644
--- a/pkg/polymer/test/noscript_test.html
+++ b/pkg/polymer/test/noscript_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>register test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.html b/pkg/polymer/test/prop_attr_bind_reflection_test.html
index e2a2a06..f1b19a5 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.html
@@ -3,6 +3,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property to attribute reflection with bind</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
 
diff --git a/pkg/polymer/test/prop_attr_reflection_test.html b/pkg/polymer/test/prop_attr_reflection_test.html
index 95c02b8..12e2f93 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_reflection_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>publish attributes</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
index a8f0845..60d6c84 100644
--- a/pkg/polymer/test/property_change_test.dart
+++ b/pkg/polymer/test/property_change_test.dart
@@ -5,6 +5,7 @@
 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';
@@ -46,12 +47,11 @@
   }
 }
 
-main() {
-  initPolymer();
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('bar change detected', () => _bar.future);
   test('zonk change detected', () => _zonk.future);
-}
+});
diff --git a/pkg/polymer/test/property_change_test.html b/pkg/polymer/test/property_change_test.html
index 01f5db9..25251d3 100644
--- a/pkg/polymer/test/property_change_test.html
+++ b/pkg/polymer/test/property_change_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property changes</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/property_observe_test.html b/pkg/polymer/test/property_observe_test.html
index a71228e..0c6bbc8 100644
--- a/pkg/polymer/test/property_observe_test.html
+++ b/pkg/polymer/test/property_observe_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property.observe changes</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/publish_attributes_test.dart b/pkg/polymer/test/publish_attributes_test.dart
index 6ff61a8..33966e7 100644
--- a/pkg/polymer/test/publish_attributes_test.dart
+++ b/pkg/polymer/test/publish_attributes_test.dart
@@ -59,8 +59,8 @@
   setUp(() => Polymer.onReady);
 
   test('published properties', () {
-    published(tag) => (querySelector('polymer-element[name=$tag]')
-        as PolymerDeclaration).publishedProperties;
+    published(tag) => (new Element.tag(tag) as PolymerElement)
+        .declaration.publishedProperties;
 
     expect(published('x-foo'), ['Foo', 'baz']);
     expect(published('x-bar'), ['Foo', 'baz', 'Bar']);
diff --git a/pkg/polymer/test/publish_attributes_test.html b/pkg/polymer/test/publish_attributes_test.html
index 9285e47..ca91807 100644
--- a/pkg/polymer/test/publish_attributes_test.html
+++ b/pkg/polymer/test/publish_attributes_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>publish attributes</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/publish_inherited_properties_test.dart b/pkg/polymer/test/publish_inherited_properties_test.dart
index dddbf29..2e7a4ac 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.dart
+++ b/pkg/polymer/test/publish_inherited_properties_test.dart
@@ -50,11 +50,13 @@
   initPolymer();
   useHtmlConfiguration();
 
-  setUp(() => Polymer.onReady);
+  setUp(() => Polymer.onReady.then((_) {
+    Polymer.register('x-noscript', XZot);
+  }));
 
   test('published properties', () {
-    published(tag) => (querySelector('polymer-element[name=$tag]')
-        as PolymerDeclaration).publishedProperties;
+    published(tag) => (new Element.tag(tag) as PolymerElement)
+        .declaration.publishedProperties;
 
     expect(published('x-zot'), ['Foo', 'Bar', 'zot', 'm']);
     expect(published('x-squid'), ['Foo', 'Bar', 'zot', 'm', 'baz', 'squid']);
diff --git a/pkg/polymer/test/publish_inherited_properties_test.html b/pkg/polymer/test/publish_inherited_properties_test.html
index 38b5bf2..024c11e 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.html
+++ b/pkg/polymer/test/publish_inherited_properties_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>publish inherited properties</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
@@ -18,7 +19,12 @@
     <polymer-element name="x-squid" extends="x-zot" attributes="squid">
     </polymer-element>
 
-    <polymer-element name="x-noscript" extends="x-zot" noscript>
+    <!--
+    Dart note: changed from 'noscript', since those are implemented by JS
+    we can't extend a 'noscript' element from Dart or have it extend a Dart
+    element.
+    -->
+    <polymer-element name="x-noscript" extends="x-zot">
     </polymer-element>
 
   <script type="application/dart" src="publish_inherited_properties_test.dart"></script>
diff --git a/pkg/polymer/test/register_test.html b/pkg/polymer/test/register_test.html
index a6085d1..b115dbe 100644
--- a/pkg/polymer/test/register_test.html
+++ b/pkg/polymer/test/register_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>register test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/take_attributes_test.html b/pkg/polymer/test/take_attributes_test.html
index 8dc5d1e..a7fa8e7 100644
--- a/pkg/polymer/test/take_attributes_test.html
+++ b/pkg/polymer/test/take_attributes_test.html
@@ -8,6 +8,7 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>take attributes</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.html b/pkg/polymer/test/template_distribute_dynamic_test.html
index 752f7b0..e42b464 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.html
+++ b/pkg/polymer/test/template_distribute_dynamic_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>template distribute</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/test/unbind_test.html b/pkg/polymer/test/unbind_test.html
index e251fc6..8b8cfbb 100644
--- a/pkg/polymer/test/unbind_test.html
+++ b/pkg/polymer/test/unbind_test.html
@@ -8,6 +8,7 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>unbind</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/template_binding/test/custom_element_bindings_test.html b/pkg/template_binding/test/custom_element_bindings_test.html
index 661f3e7..45bdb99 100644
--- a/pkg/template_binding/test/custom_element_bindings_test.html
+++ b/pkg/template_binding/test/custom_element_bindings_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running custom_element_bindings_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/pkg/template_binding/test/utils.dart b/pkg/template_binding/test/utils.dart
index 11f7668..35e37b3 100644
--- a/pkg/template_binding/test/utils.dart
+++ b/pkg/template_binding/test/utils.dart
@@ -13,7 +13,7 @@
 /// A small method to help readability. Used to cause the next "then" in a chain
 /// to happen in the next microtask:
 ///
-///     future.then(newMicrotask).then(...)
+///     future.then(endOfMicrotask).then(...)
 endOfMicrotask(_) => new Future.value();
 
 /// A small method to help readability. Used to cause the next "then" in a chain
diff --git a/pkg/third_party/angular_tests/browser_test.html b/pkg/third_party/angular_tests/browser_test.html
index 941c511..1ada647 100644
--- a/pkg/third_party/angular_tests/browser_test.html
+++ b/pkg/third_party/angular_tests/browser_test.html
@@ -15,7 +15,7 @@
 <body>
   <h1> Running browser_test.dart </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/pkg/web_components/lib/build.log b/pkg/web_components/lib/build.log
index 22b15eb..b83bef4 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,21 +1,21 @@
 BUILD LOG
 ---------
-Build Time: 2014-02-26T18:22:09
+Build Time: 2014-03-04T18:07:47
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.21
+nodejs: v0.8.21
 chai: 1.9.0
 grunt: 0.4.2
 grunt-audit: 0.0.2
 grunt-concat-sourcemap: 0.4.1
 grunt-contrib-concat: 0.3.0
 grunt-contrib-uglify: 0.3.2
-grunt-contrib-yuidoc: 0.5.1
+grunt-contrib-yuidoc: 0.5.0
 grunt-karma: 0.6.2
 karma: 0.10.9
 karma-chrome-launcher: 0.1.2
-karma-coffee-preprocessor: 0.1.3
+karma-coffee-preprocessor: 0.1.2
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
 karma-html2js-preprocessor: 0.1.0
@@ -27,22 +27,22 @@
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
 mocha: 1.17.1
-requirejs: 2.1.11
+requirejs: 2.1.10
 
 REPO REVISIONS
 ==============
-CustomElements: b0ba30da80241b79a43b0c1825fe1894e2933306
+CustomElements: f68d8e2f1e624b427ccd2630303ecbf407b06f73
 HTMLImports: cae0c94f3be4b492c0db686ffdd0288b49dbdfe7
-NodeBind: eb5ee7941f712cbee755da24ab7553e2d90fb99d
-PointerEvents: a60135544ba3e6caf26734f8ac00aa92ac14b17e
-PointerGestures: 0ccb422a629c10b3b7790c7ad8759408e4fd60c6
-ShadowDOM: 37e59b22ebafc83e6bcacae9cb34eab6bceb159b
+NodeBind: 62f7e53baee55d5821747227de9b407da1c261ec
+PointerEvents: f2964bcc070231c41391cb864fa0c6578031592c
+PointerGestures: 96be1f398a50dadd8ec359060cceb6b24fd38452
+ShadowDOM: e1d3e2629473c50b6dd14cce3b82a48602bc150a
 TemplateBinding: 08008af605298aaf2d56ef34d4af4df70679ea61
 WeakMap: a0947a9a0f58f5733f464755c3b86de624b00a5d
-observe-js: 3ba9aeec73f7864d519fb13c6f38cb10923cdfd9
-platform: 5800a7ad75d3f8531ec11949a5404444d90a665e
+observe-js: 3d7b5aa5eb7b403ee7be398280113f7cc36e448a
+platform: 8135b9beaffb6fa77843dbd06370bc9dc1919db4
 polymer-expressions: 470cced7cf167bd164f0b924ceb088dd7a8240b9
 
 BUILD HASHES
 ============
-build/platform.js: ab69b18a5f2d05a65df178b4b510913404c65a4c
\ No newline at end of file
+build/platform.js: edb4c188b2f609c3da6f4e650703539f440919bb
\ No newline at end of file
diff --git a/pkg/web_components/lib/dart_support.js b/pkg/web_components/lib/dart_support.js
index 2f9e1af..44b5a38c 100644
--- a/pkg/web_components/lib/dart_support.js
+++ b/pkg/web_components/lib/dart_support.js
@@ -6,6 +6,12 @@
   var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
   if (!ShadowDOMPolyfill) return;
 
+  if (navigator.userAgent.indexOf('(Dart)') !== -1) {
+    console.error("ShadowDOMPolyfill polyfill was loaded in Dartium. This " +
+        "will not work. This indicates that Dartium's Chrome version is " +
+        "not compatible with this version of web_components.");
+  }
+
   var needsConstructorFix = window.constructor === window.Window;
 
   // TODO(jmesserly): we need to wrap document somehow (a dart:html hook?)
@@ -30,7 +36,7 @@
       if (obj instanceof HTMLTemplateElement) return 'HTMLTemplateElement';
 
       var unwrapped = unwrapIfNeeded(obj);
-      if (needsConstructorFix || obj !== unwrapped) {
+      if (unwrapped && (needsConstructorFix || obj !== unwrapped)) {
         // Fix up class names for Firefox, or if using the minified polyfill.
         // dart2js prefers .constructor.name, but there are all kinds of cases
         // where this will give the wrong answer.
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index 0be0a08..6fa2b7b 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -494,10 +494,6 @@
     }
 
     function reset() {
-      resetScheduled = false;
-      if (!resetNeeded)
-        return;
-
       var objs = toRemove === emptyArray ? [] : toRemove;
       toRemove = objects;
       objects = objs;
@@ -520,16 +516,26 @@
       toRemove.length = 0;
     }
 
+    function scheduledReset() {
+      resetScheduled = false;
+      if (!resetNeeded)
+        return;
+
+      reset();
+    }
+
     function scheduleReset() {
       if (resetScheduled)
         return;
 
       resetNeeded = true;
       resetScheduled = true;
-      runEOM(reset);
+      runEOM(scheduledReset);
     }
 
     function callback() {
+      reset();
+
       var observer;
 
       for (var id in observers) {
@@ -539,8 +545,6 @@
 
         observer.check_();
       }
-
-      scheduleReset();
     }
 
     var record = {
@@ -1921,6 +1925,8 @@
       enumerable: false,
       writable: true
     });
+    // Set it again. Some VMs optimizes objects that are used as prototypes.
+    wrapperConstructor.prototype = wrapperPrototype;
   }
 
   function isWrapperFor(wrapperConstructor, nativeConstructor) {
@@ -1948,9 +1954,9 @@
     function GeneratedWrapper(node) {
       superWrapperConstructor.call(this, node);
     }
-    GeneratedWrapper.prototype =
-        Object.create(superWrapperConstructor.prototype);
-    GeneratedWrapper.prototype.constructor = GeneratedWrapper;
+    var p = Object.create(superWrapperConstructor.prototype);
+    p.constructor = GeneratedWrapper;
+    GeneratedWrapper.prototype = p;
 
     return GeneratedWrapper;
   }
@@ -2524,6 +2530,70 @@
 
 })(window.ShadowDOMPolyfill);
 
+/**
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  /**
+   * A tree scope represents the root of a tree. All nodes in a tree point to
+   * the same TreeScope object. The tree scope of a node get set the first time
+   * it is accessed or when a node is added or remove to a tree.
+   * @constructor
+   */
+  function TreeScope(root, parent) {
+    this.root = root;
+    this.parent = parent;
+  }
+
+  TreeScope.prototype = {
+    get renderer() {
+      if (this.root instanceof scope.wrappers.ShadowRoot) {
+        return scope.getRendererForHost(this.root.host);
+      }
+      return null;
+    },
+
+    contains: function(treeScope) {
+      for (; treeScope; treeScope = treeScope.parent) {
+        if (treeScope === this)
+          return true;
+      }
+      return false;
+    }
+  };
+
+  function setTreeScope(node, treeScope) {
+    if (node.treeScope_ !== treeScope) {
+      node.treeScope_ = treeScope;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        setTreeScope(child, treeScope);
+      }
+    }
+  }
+
+  function getTreeScope(node) {
+    if (node.treeScope_)
+      return node.treeScope_;
+    var parent = node.parentNode;
+    var treeScope;
+    if (parent)
+      treeScope = getTreeScope(parent);
+    else
+      treeScope = new TreeScope(node, null);
+    return node.treeScope_ = treeScope;
+  }
+
+  scope.TreeScope = TreeScope;
+  scope.getTreeScope = getTreeScope;
+  scope.setTreeScope = setTreeScope;
+
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -2532,6 +2602,7 @@
   'use strict';
 
   var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+  var getTreeScope = scope.getTreeScope;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
   var unwrap = scope.unwrap;
@@ -2686,27 +2757,10 @@
     return getInsertionParent(node);
   }
 
-  function rootOfNode(node) {
-    var p;
-    while (p = node.parentNode) {
-      node = p;
-    }
-    return node;
-  }
-
   function inSameTree(a, b) {
-    return rootOfNode(a) === rootOfNode(b);
+    return getTreeScope(a) === getTreeScope(b);
   }
 
-  function enclosedBy(a, b) {
-    if (a === b)
-      return true;
-    if (a instanceof wrappers.ShadowRoot)
-      return enclosedBy(rootOfNode(a.host), b);
-    return false;
-  }
-
-
   function dispatchOriginalEvent(originalEvent) {
     // Make sure this event is only dispatched once.
     if (handledEventsTable.get(originalEvent))
@@ -2921,12 +2975,12 @@
       if (eventPath) {
         var index = 0;
         var lastIndex = eventPath.length - 1;
-        var baseRoot = rootOfNode(currentTargetTable.get(this));
+        var baseRoot = getTreeScope(currentTargetTable.get(this));
 
         for (var i = 0; i <= lastIndex; i++) {
           var currentTarget = eventPath[i].currentTarget;
-          var currentRoot = rootOfNode(currentTarget);
-          if (enclosedBy(baseRoot, currentRoot) &&
+          var currentRoot = getTreeScope(currentTarget);
+          if (currentRoot.contains(baseRoot) &&
               // Make sure we do not add Window to the path.
               (i !== lastIndex || currentTarget instanceof wrappers.Node)) {
             nodeList[index++] = currentTarget;
@@ -3394,22 +3448,27 @@
 
 })(window.ShadowDOMPolyfill);
 
-// Copyright 2012 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
+/**
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
 
 (function(scope) {
   'use strict';
 
   var EventTarget = scope.wrappers.EventTarget;
   var NodeList = scope.wrappers.NodeList;
+  var TreeScope = scope.TreeScope;
   var assert = scope.assert;
   var defineWrapGetter = scope.defineWrapGetter;
   var enqueueMutation = scope.enqueueMutation;
+  var getTreeScope = scope.getTreeScope;
   var isWrapper = scope.isWrapper;
   var mixin = scope.mixin;
   var registerTransientObservers = scope.registerTransientObservers;
   var registerWrapper = scope.registerWrapper;
+  var setTreeScope = scope.setTreeScope;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
   var wrapIfNeeded = scope.wrapIfNeeded;
@@ -3526,23 +3585,27 @@
   }
 
   // http://dom.spec.whatwg.org/#node-is-inserted
-  function nodeWasAdded(node) {
+  function nodeWasAdded(node, treeScope) {
+    setTreeScope(node, treeScope);
     node.nodeIsInserted_();
   }
 
-  function nodesWereAdded(nodes) {
+  function nodesWereAdded(nodes, parent) {
+    var treeScope = getTreeScope(parent);
     for (var i = 0; i < nodes.length; i++) {
-      nodeWasAdded(nodes[i]);
+      nodeWasAdded(nodes[i], treeScope);
     }
   }
 
   // http://dom.spec.whatwg.org/#node-is-removed
   function nodeWasRemoved(node) {
-    // Nothing at this point in time.
+    setTreeScope(node, new TreeScope(node, null));
   }
 
   function nodesWereRemoved(nodes) {
-    // Nothing at this point in time.
+    for (var i = 0; i < nodes.length; i++) {
+      nodeWasRemoved(nodes[i]);
+    }
   }
 
   function ensureSameOwnerDocument(parent, child) {
@@ -3660,6 +3723,17 @@
     return clone;
   }
 
+  function contains(self, child) {
+    if (!child || getTreeScope(self) !== getTreeScope(child))
+      return false;
+
+    for (var node = child; node; node = node.parentNode) {
+      if (node === self)
+        return true;
+    }
+    return false;
+  }
+
   var OriginalNode = window.Node;
 
   /**
@@ -3706,6 +3780,8 @@
      * @private
      */
     this.previousSibling_ = undefined;
+
+    this.treeScope_ = undefined;
   }
 
   var OriginalDocumentFragment = window.DocumentFragment;
@@ -3794,7 +3870,7 @@
         previousSibling: previousNode
       });
 
-      nodesWereAdded(nodes);
+      nodesWereAdded(nodes, this);
 
       return childWrapper;
     },
@@ -3926,7 +4002,7 @@
       });
 
       nodeWasRemoved(oldChildWrapper);
-      nodesWereAdded(nodes);
+      nodesWereAdded(nodes, this);
 
       return oldChildWrapper;
     },
@@ -4018,7 +4094,7 @@
       });
 
       nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes);
+      nodesWereAdded(addedNodes, this);
     },
 
     get childNodes() {
@@ -4036,18 +4112,7 @@
     },
 
     contains: function(child) {
-      if (!child)
-        return false;
-
-      child = wrapIfNeeded(child);
-
-      // TODO(arv): Optimize using ownerDocument etc.
-      if (child === this)
-        return true;
-      var parentNode = child.parentNode;
-      if (!parentNode)
-        return false;
-      return this.contains(parentNode);
+      return contains(this, wrapIfNeeded(child));
     },
 
     compareDocumentPosition: function(otherNode) {
@@ -4104,13 +4169,13 @@
   delete Node.prototype.querySelectorAll;
   Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
 
+  scope.cloneNode = cloneNode;
   scope.nodeWasAdded = nodeWasAdded;
   scope.nodeWasRemoved = nodeWasRemoved;
   scope.nodesWereAdded = nodesWereAdded;
   scope.nodesWereRemoved = nodesWereRemoved;
   scope.snapshotNodeList = snapshotNodeList;
   scope.wrappers.Node = Node;
-  scope.cloneNode = cloneNode;
 
 })(window.ShadowDOMPolyfill);
 
@@ -4682,7 +4747,7 @@
       });
 
       nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes);
+      nodesWereAdded(addedNodes, this);
     },
 
     get outerHTML() {
@@ -5723,8 +5788,10 @@
   'use strict';
 
   var DocumentFragment = scope.wrappers.DocumentFragment;
+  var TreeScope = scope.TreeScope;
   var elementFromPoint = scope.elementFromPoint;
   var getInnerHTML = scope.getInnerHTML;
+  var getTreeScope = scope.getTreeScope;
   var mixin = scope.mixin;
   var rewrap = scope.rewrap;
   var setInnerHTML = scope.setInnerHTML;
@@ -5743,6 +5810,8 @@
     // DocumentFragment instance. Override that.
     rewrap(node, this);
 
+    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));
+
     var oldShadowRoot = hostWrapper.shadowRoot;
     nextOlderShadowTreeTable.set(this, oldShadowRoot);
 
@@ -5798,6 +5867,7 @@
   var Node = scope.wrappers.Node;
   var ShadowRoot = scope.wrappers.ShadowRoot;
   var assert = scope.assert;
+  var getTreeScope = scope.getTreeScope;
   var mixin = scope.mixin;
   var oneOf = scope.oneOf;
   var unwrap = scope.unwrap;
@@ -6017,7 +6087,11 @@
     // TODO(arv): Order these in document order. That way we do not have to
     // render something twice.
     for (var i = 0; i < pendingDirtyRenderers.length; i++) {
-      pendingDirtyRenderers[i].render();
+      var renderer = pendingDirtyRenderers[i];
+      var parentRenderer = renderer.parentRenderer;
+      if (parentRenderer && parentRenderer.dirty)
+        continue;
+      renderer.render();
     }
 
     pendingDirtyRenderers = [];
@@ -6043,10 +6117,9 @@
   }
 
   function getShadowRootAncestor(node) {
-    for (; node; node = node.parentNode) {
-      if (node instanceof ShadowRoot)
-        return node;
-    }
+    var root = getTreeScope(node).root;
+    if (root instanceof ShadowRoot)
+      return root;
     return null;
   }
 
@@ -6163,6 +6236,10 @@
       this.dirty = false;
     },
 
+    get parentRenderer() {
+      return getTreeScope(this.host).renderer;
+    },
+
     invalidate: function() {
       if (!this.dirty) {
         this.dirty = true;
@@ -6193,8 +6270,7 @@
 
       if (isShadowHost(node)) {
         var renderer = getRendererForHost(node);
-        // renderNode.skip = !renderer.dirty;
-        renderer.invalidate();
+        renderNode.skip = !renderer.dirty;
         renderer.render(renderNode);
       } else {
         for (var child = node.firstChild; child; child = child.nextSibling) {
@@ -6593,6 +6669,7 @@
   var Selection = scope.wrappers.Selection;
   var SelectorsInterface = scope.SelectorsInterface;
   var ShadowRoot = scope.wrappers.ShadowRoot;
+  var TreeScope = scope.TreeScope;
   var cloneNode = scope.cloneNode;
   var defineWrapGetter = scope.defineWrapGetter;
   var elementFromPoint = scope.elementFromPoint;
@@ -6611,6 +6688,7 @@
 
   function Document(node) {
     Node.call(this, node);
+    this.treeScope_ = new TreeScope(this, null);
   }
   Document.prototype = Object.create(Node.prototype);
 
@@ -7238,55 +7316,68 @@
   // 2. optionally tag root nodes with scope name
   // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */
   // 4. shim :host and scoping
-  shimStyling: function(root, name, extendsName, ownSheet) {
+  shimStyling: function(root, name, extendsName) {
+    var scopeStyles = this.prepareRoot(root, name, extendsName);
     var typeExtension = this.isTypeExtension(extendsName);
+    var scopeSelector = this.makeScopeSelector(name, typeExtension);
     // use caching to make working with styles nodes easier and to facilitate
     // lookup of extendee
-    var def = this.registerDefinition(root, name, extendsName);
-    // find styles and apply shimming...
+    var cssText = stylesToCssText(scopeStyles, true);
+    cssText = this.scopeCssText(cssText, scopeSelector);
+    // cache shimmed css on root for user extensibility
+    if (root) {
+      root.shimmedStyle = cssText;
+    }
+    // add style to document
+    this.addCssToDocument(cssText, name);
+  },
+  /*
+  * Shim a style element with the given selector. Returns cssText that can
+  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
+  */
+  shimStyle: function(style, selector) {
+    return this.shimCssText(style.textContent, selector);
+  },
+  /*
+  * Shim some cssText with the given selector. Returns cssText that can
+  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
+  */
+  shimCssText: function(cssText, selector) {
+    cssText = this.insertDirectives(cssText);
+    return this.scopeCssText(cssText, selector);
+  },
+  makeScopeSelector: function(name, typeExtension) {
+    if (name) {
+      return typeExtension ? '[is=' + name + ']' : name;
+    }
+    return '';
+  },
+  isTypeExtension: function(extendsName) {
+    return extendsName && extendsName.indexOf('-') < 0;
+  },
+  prepareRoot: function(root, name, extendsName) {
+    var def = this.registerRoot(root, name, extendsName);
+    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
+    // remove existing style elements
+    this.removeStyles(root, def.rootStyles);
+    // apply strict attr
     if (this.strictStyling) {
       this.applyScopeToContent(root, name);
     }
-    var cssText = this.stylesToShimmedCssText(def.rootStyles, def.scopeStyles,
-        name, typeExtension);
-    // provide shimmedStyle for user extensibility
-    def.shimmedStyle = cssTextToStyle(cssText);
-    if (root) {
-      root.shimmedStyle = def.shimmedStyle;
-    }
-    // remove existing style elements
-    for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]); 
-        i++) {
+    return def.scopeStyles;
+  },
+  removeStyles: function(root, styles) {
+    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {
       s.parentNode.removeChild(s);
     }
-    // add style to document
-    if (ownSheet) {
-      addOwnSheet(cssText, name);
-    } else {
-      addCssToDocument(cssText);
-    }
   },
-  // apply @polyfill rules + :host and scope shimming
-  stylesToShimmedCssText: function(rootStyles, scopeStyles, name,
-      typeExtension) {
-    name = name || '';
-    // insert @polyfill and @polyfill-rule rules into style elements
-    // scoping process takes care of shimming these
-    this.insertPolyfillDirectives(rootStyles);
-    this.insertPolyfillRules(rootStyles);
-    var cssText = this.shimScoping(scopeStyles, name, typeExtension);
-    // note: we only need to do rootStyles since these are unscoped.
-    cssText += this.extractPolyfillUnscopedRules(rootStyles);
-    return cssText.trim();
-  },
-  registerDefinition: function(root, name, extendsName) {
+  registerRoot: function(root, name, extendsName) {
     var def = this.registry[name] = {
       root: root,
       name: name,
       extendsName: extendsName
     }
-    var styles = root ? root.querySelectorAll('style') : [];
-    styles = styles ? Array.prototype.slice.call(styles, 0) : [];
+    var styles = this.findStyles(root);
     def.rootStyles = styles;
     def.scopeStyles = def.rootStyles;
     var extendee = this.registry[def.extendsName];
@@ -7295,8 +7386,14 @@
     }
     return def;
   },
-  isTypeExtension: function(extendsName) {
-    return extendsName && extendsName.indexOf('-') < 0;
+  findStyles: function(root) {
+    if (!root) {
+      return [];
+    }
+    var styles = root.querySelectorAll('style');
+    return Array.prototype.filter.call(styles, function(s) {
+      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
+    });
   },
   applyScopeToContent: function(root, name) {
     if (root) {
@@ -7313,58 +7410,83 @@
           this);
     }
   },
+  insertDirectives: function(cssText) {
+    cssText = this.insertPolyfillDirectivesInCssText(cssText);
+    return this.insertPolyfillRulesInCssText(cssText);
+  },
   /*
    * Process styles to convert native ShadowDOM rules that will trip
-   * up the css parser; we rely on decorating the stylesheet with comments.
+   * up the css parser; we rely on decorating the stylesheet with inert rules.
    * 
    * For example, we convert this rule:
    * 
-   * (comment start) @polyfill :host menu-item (comment end)
-   * shadow::-webkit-distributed(menu-item) {
+   * polyfill-next-selector { content: ':host menu-item'; }
+   * ::content menu-item {
    * 
    * to this:
    * 
    * scopeName menu-item {
    *
   **/
-  insertPolyfillDirectives: function(styles) {
-    if (styles) {
-      Array.prototype.forEach.call(styles, function(s) {
-        s.textContent = this.insertPolyfillDirectivesInCssText(s.textContent);
-      }, this);
-    }
-  },
   insertPolyfillDirectivesInCssText: function(cssText) {
-    return cssText.replace(cssPolyfillCommentRe, function(match, p1) {
+    // TODO(sorvell): remove either content or comment
+    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
       // remove end comment delimiter and add block start
       return p1.slice(0, -2) + '{';
     });
+    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
+      return p1 + ' {';
+    });
   },
   /*
    * Process styles to add rules which will only apply under the polyfill
    * 
    * For example, we convert this rule:
    * 
-   * (comment start) @polyfill-rule :host menu-item { 
-   * ... } (comment end)
+   * polyfill-rule {
+   *   content: ':host menu-item';
+   * ...
+   * }
    * 
    * to this:
    * 
    * scopeName menu-item {...}
    *
   **/
-  insertPolyfillRules: function(styles) {
-    if (styles) {
-      Array.prototype.forEach.call(styles, function(s) {
-        s.textContent = this.insertPolyfillRulesInCssText(s.textContent);
-      }, this);
-    }
-  },
   insertPolyfillRulesInCssText: function(cssText) {
-    return cssText.replace(cssPolyfillRuleCommentRe, function(match, p1) {
+    // TODO(sorvell): remove either content or comment
+    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
       // remove end comment delimiter
       return p1.slice(0, -1);
     });
+    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
+      var rule = match.replace(p1, '').replace(p2, '');
+      return p3 + rule;
+    });
+  },
+  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
+   * 
+   *  .foo {... } 
+   *  
+   *  and converts this to
+   *  
+   *  scopeName .foo { ... }
+  */
+  scopeCssText: function(cssText, scopeSelector) {
+    var unscoped = this.extractUnscopedRulesFromCssText(cssText);
+    cssText = this.insertPolyfillHostInCssText(cssText);
+    cssText = this.convertColonHost(cssText);
+    cssText = this.convertColonAncestor(cssText);
+    cssText = this.convertCombinators(cssText);
+    if (scopeSelector) {
+      var self = this, cssText;
+      withCssRules(cssText, function(rules) {
+        cssText = self.scopeRules(rules, scopeSelector);
+      });
+
+    }
+    cssText = cssText + '\n' + unscoped;
+    return cssText.trim();
   },
   /*
    * Process styles to add rules which will only apply under the polyfill
@@ -7380,52 +7502,17 @@
    * menu-item {...}
    *
   **/
-  extractPolyfillUnscopedRules: function(styles) {
-    var cssText = '';
-    if (styles) {
-      Array.prototype.forEach.call(styles, function(s) {
-        cssText += this.extractPolyfillUnscopedRulesFromCssText(
-            s.textContent) + '\n\n';
-      }, this);
+  extractUnscopedRulesFromCssText: function(cssText) {
+    // TODO(sorvell): remove either content or comment
+    var r = '', m;
+    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
+      r += m[1].slice(0, -1) + '\n\n';
     }
-    return cssText;
-  },
-  extractPolyfillUnscopedRulesFromCssText: function(cssText) {
-    var r = '', matches;
-    while (matches = cssPolyfillUnscopedRuleCommentRe.exec(cssText)) {
-      r += matches[1].slice(0, -1) + '\n\n';
+    while (m = cssContentUnscopedRuleRe.exec(cssText)) {
+      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\n\n';
     }
     return r;
   },
-  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
-   * 
-   *  .foo {... } 
-   *  
-   *  and converts this to
-   *  
-   *  scopeName .foo { ... }
-  */
-  shimScoping: function(styles, name, typeExtension) {
-    if (styles) {
-      return this.convertScopedStyles(styles, name, typeExtension);
-    }
-  },
-  convertScopedStyles: function(styles, name, typeExtension) {
-    var cssText = stylesToCssText(styles);
-    cssText = this.insertPolyfillHostInCssText(cssText);
-    cssText = this.convertColonHost(cssText);
-    cssText = this.convertColonAncestor(cssText);
-    cssText = this.convertCombinators(cssText);
-    if (name) {
-      var self = this, cssText;
-      
-      withCssRules(cssText, function(rules) {
-        cssText = self.scopeRules(rules, name, typeExtension);
-      });
-
-    }
-    return cssText;
-  },
   /*
    * convert a rule like :host(.foo) > .bar { }
    *
@@ -7489,17 +7576,17 @@
     return cssText.replace(/\^\^/g, ' ').replace(/\^/g, ' ');
   },
   // change a selector like 'div' to 'name div'
-  scopeRules: function(cssRules, name, typeExtension) {
+  scopeRules: function(cssRules, scopeSelector) {
     var cssText = '';
     if (cssRules) {
       Array.prototype.forEach.call(cssRules, function(rule) {
         if (rule.selectorText && (rule.style && rule.style.cssText)) {
-          cssText += this.scopeSelector(rule.selectorText, name, typeExtension, 
+          cssText += this.scopeSelector(rule.selectorText, scopeSelector, 
             this.strictStyling) + ' {\n\t';
           cssText += this.propertiesFromRule(rule) + '\n}\n\n';
         } else if (rule.type === CSSRule.MEDIA_RULE) {
           cssText += '@media ' + rule.media.mediaText + ' {\n';
-          cssText += this.scopeRules(rule.cssRules, name, typeExtension);
+          cssText += this.scopeRules(rule.cssRules, scopeSelector);
           cssText += '\n}\n\n';
         } else if (rule.cssText) {
           cssText += rule.cssText + '\n\n';
@@ -7508,43 +7595,43 @@
     }
     return cssText;
   },
-  scopeSelector: function(selector, name, typeExtension, strict) {
+  scopeSelector: function(selector, scopeSelector, strict) {
     var r = [], parts = selector.split(',');
     parts.forEach(function(p) {
       p = p.trim();
-      if (this.selectorNeedsScoping(p, name, typeExtension)) {
+      if (this.selectorNeedsScoping(p, scopeSelector)) {
         p = (strict && !p.match(polyfillHostNoCombinator)) ? 
-            this.applyStrictSelectorScope(p, name) :
-            this.applySimpleSelectorScope(p, name, typeExtension);
+            this.applyStrictSelectorScope(p, scopeSelector) :
+            this.applySimpleSelectorScope(p, scopeSelector);
       }
       r.push(p);
     }, this);
     return r.join(', ');
   },
-  selectorNeedsScoping: function(selector, name, typeExtension) {
-    var re = this.makeScopeMatcher(name, typeExtension);
+  selectorNeedsScoping: function(selector, scopeSelector) {
+    var re = this.makeScopeMatcher(scopeSelector);
     return !selector.match(re);
   },
-  makeScopeMatcher: function(name, typeExtension) {
-    var matchScope = typeExtension ? '\\[is=[\'"]?' + name + '[\'"]?\\]' : name;
-    return new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');
+  makeScopeMatcher: function(scopeSelector) {
+    scopeSelector = scopeSelector.replace(/\[/g, '\\[').replace(/\[/g, '\\]');
+    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');
   },
   // scope via name and [is=name]
-  applySimpleSelectorScope: function(selector, name, typeExtension) {
-    var scoper = typeExtension ? '[is=' + name + ']' : name;
+  applySimpleSelectorScope: function(selector, scopeSelector) {
     if (selector.match(polyfillHostRe)) {
-      selector = selector.replace(polyfillHostNoCombinator, scoper);
-      return selector.replace(polyfillHostRe, scoper + ' ');
+      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
+      return selector.replace(polyfillHostRe, scopeSelector + ' ');
     } else {
-      return scoper + ' ' + selector;
+      return scopeSelector + ' ' + selector;
     }
   },
   // return a selector with [name] suffix on each simple selector
   // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
-  applyStrictSelectorScope: function(selector, name) {
+  applyStrictSelectorScope: function(selector, scopeSelector) {
+    scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, '$1');
     var splits = [' ', '>', '+', '~'],
       scoped = selector,
-      attrName = '[' + name + ']';
+      attrName = '[' + scopeSelector + ']';
     splits.forEach(function(sep) {
       var parts = scoped.split(sep);
       scoped = parts.map(function(p) {
@@ -7570,14 +7657,37 @@
           rule.style.content + '\';');
     }
     return rule.style.cssText;
+  },
+  replaceTextInStyles: function(styles, action) {
+    if (styles && action) {
+      if (!(styles instanceof Array)) {
+        styles = [styles];
+      }
+      Array.prototype.forEach.call(styles, function(s) {
+        s.textContent = action.call(this, s.textContent);
+      }, this);
+    }
+  },
+  addCssToDocument: function(cssText, name) {
+    if (cssText.match('@import')) {
+      addOwnSheet(cssText, name);
+    } else {
+      addCssToDocument(cssText);
+    }
   }
 };
 
 var selectorRe = /([^{]*)({[\s\S]*?})/gim,
     cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
-    cssPolyfillCommentRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
-    cssPolyfillRuleCommentRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssPolyfillUnscopedRuleCommentRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
+    // TODO(sorvell): remove either content or comment
+    cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
+    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,
+    // TODO(sorvell): remove either content or comment
+    cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
+    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
+    // TODO(sorvell): remove either content or comment
+    cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
+    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
     cssPseudoRe = /::(x-[^\s{,(]*)/gim,
     cssPartRe = /::part\(([^)]*)\)/gim,
     // note: :host pre-processed to -shadowcsshost.
@@ -7595,7 +7705,7 @@
     colonAncestorRe = /\:ancestor/gim,
     /* host name without combinator */
     polyfillHostNoCombinator = polyfillHost + '-no-combinator',
-    polyfillHostRe = new RegExp(polyfillHost, 'gim');
+    polyfillHostRe = new RegExp(polyfillHost, 'gim'),
     polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');
 
 function stylesToCssText(styles, preserveComments) {
@@ -7700,6 +7810,7 @@
 
 var SHIM_ATTRIBUTE = 'shim-shadowdom';
 var SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';
+var NO_SHIM_ATTRIBUTE = 'no-shim';
 
 var sheet;
 function getSheet() {
@@ -7754,8 +7865,7 @@
         } else {
           urlResolver.resolveStyle(style);  
         }
-        var styles = [style];
-        style.textContent = ShadowCSS.stylesToShimmedCssText(styles, styles);
+        style.textContent = ShadowCSS.shimStyle(style);
         style.removeAttribute(SHIM_ATTRIBUTE, '');
         style.setAttribute(SHIMMED_ATTRIBUTE, '');
         style[SHIMMED_ATTRIBUTE] = true;
@@ -11712,6 +11822,7 @@
     var ev = new MouseEvent('click', {buttons: 1});
     NEW_MOUSE_EVENT = true;
     HAS_BUTTONS = ev.buttons === 1;
+    ev = null;
   } catch(e) {
   }
 
@@ -11772,10 +11883,9 @@
     // is to call initMouseEvent with a buttonArg value of -1.
     //
     // This is fixed with DOM Level 4's use of buttons
-    var buttons;
-    if (inDict.buttons || HAS_BUTTONS) {
-      buttons = inDict.buttons;
-    } else {
+    var buttons = inDict.buttons;
+    // touch has two possible buttons state: 0 and 1, rely on being told the right one
+    if (!HAS_BUTTONS && !buttons && inType !== 'touch') {
       switch (inDict.which) {
         case 1: buttons = 1; break;
         case 2: buttons = 4; break;
@@ -12320,7 +12430,11 @@
     },
     // register all touch-action = none nodes on document load
     installOnLoad: function() {
-      document.addEventListener('DOMContentLoaded', this.installNewSubtree.bind(this, document));
+      document.addEventListener('readystatechange', function() {
+        if (document.readyState === 'complete') {
+          this.installNewSubtree(document);
+        }
+      }.bind(this));
     },
     isElement: function(n) {
       return n.nodeType === Node.ELEMENT_NODE;
@@ -12605,6 +12719,13 @@
         clearTimeout(this.resetId);
       }
     },
+    typeToButtons: function(type) {
+      var ret = 0;
+      if (type === 'touchstart' || type === 'touchmove') {
+        ret = 1;
+      }
+      return ret;
+    },
     touchToPointer: function(inTouch) {
       var e = dispatcher.cloneEvent(inTouch);
       // Spec specifies that pointerId 1 is reserved for Mouse.
@@ -12616,7 +12737,7 @@
       e.cancelable = true;
       e.detail = this.clickCount;
       e.button = 0;
-      e.buttons = 1;
+      e.buttons = this.typeToButtons(this.currentTouchEvent);
       e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
       e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
       e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
@@ -12626,6 +12747,7 @@
     },
     processTouches: function(inEvent, inFunction) {
       var tl = inEvent.changedTouches;
+      this.currentTouchEvent = inEvent.type;
       var pointers = touchMap(tl, this.touchToPointer, this);
       // forward touch preventDefaults
       pointers.forEach(function(p) {
@@ -13360,9 +13482,11 @@
     }
   };
   dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
+  // recognizers call into the dispatcher and load later
+  // solve the chicken and egg problem by having registerScopes module run last
+  dispatcher.registerQueue = [];
+  dispatcher.immediateRegister = false;
   scope.dispatcher = dispatcher;
-  var registerQueue = [];
-  var immediateRegister = false;
   /**
    * Enable gesture events for a given scope, typically
    * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).
@@ -13373,22 +13497,17 @@
    * support on.
    */
   scope.register = function(inScope) {
-    if (immediateRegister) {
+    if (dispatcher.immediateRegister) {
       var pe = window.PointerEventsPolyfill;
       if (pe) {
         pe.register(inScope);
       }
       scope.dispatcher.registerTarget(inScope);
     } else {
-      registerQueue.push(inScope);
+      dispatcher.registerQueue.push(inScope);
     }
   };
-  // wait to register scopes until recognizers load
-  document.addEventListener('DOMContentLoaded', function() {
-    immediateRegister = true;
-    registerQueue.push(document);
-    registerQueue.forEach(scope.register);
-  });
+  scope.register(document);
 })(window.PointerGestures);
 
 /*
@@ -14052,6 +14171,7 @@
       if (inEvent.isPrimary && !inEvent.tapPrevented) {
         pointermap.set(inEvent.pointerId, {
           target: inEvent.target,
+          buttons: inEvent.buttons,
           x: inEvent.clientX,
           y: inEvent.clientY
         });
@@ -14067,15 +14187,19 @@
         }
       }
     },
-    shouldTap: function(e) {
+    shouldTap: function(e, downState) {
       if (!e.tapPrevented) {
-        // only allow left click to tap for mouse
-        return e.pointerType === 'mouse' ? e.buttons === 1 : true;
+        if (e.pointerType === 'mouse') {
+          // only allow left click to tap for mouse
+          return downState.buttons === 1;
+        } else {
+          return true;
+        }
       }
     },
     pointerup: function(inEvent) {
       var start = pointermap.get(inEvent.pointerId);
-      if (start && this.shouldTap(inEvent)) {
+      if (start && this.shouldTap(inEvent, start)) {
         var t = scope.findLCA(start.target, inEvent.target);
         if (t) {
           var e = dispatcher.makeEvent('tap', {
@@ -14114,6 +14238,37 @@
   dispatcher.registerRecognizer('tap', tap);
 })(window.PointerGestures);
 
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+/**
+ * Because recognizers are loaded after dispatcher, we have to wait to register
+ * scopes until after all the recognizers.
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  function registerScopes() {
+    dispatcher.immediateRegister = true;
+    var rq = dispatcher.registerQueue;
+    rq.forEach(scope.register);
+    rq.length = 0;
+  }
+  if (document.readyState === 'complete') {
+    registerScopes();
+  } else {
+    // register scopes after a steadystate is reached
+    // less MutationObserver churn
+    document.addEventListener('readystatechange', function() {
+      if (document.readyState === 'complete') {
+        registerScopes();
+      }
+    });
+  }
+})(window.PointerGestures);
+
 // Copyright 2011 Google Inc.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -14141,33 +14296,6 @@
     return typeof node.getElementById === 'function' ? node : null;
   }
 
-  // JScript does not have __proto__. We wrap all object literals with
-  // createObject which uses Object.create, Object.defineProperty and
-  // Object.getOwnPropertyDescriptor to create a new object that does the exact
-  // same thing. The main downside to this solution is that we have to extract
-  // all those property descriptors for IE.
-  var createObject = ('__proto__' in {}) ?
-      function(obj) { return obj; } :
-      function(obj) {
-        var proto = obj.__proto__;
-        if (!proto)
-          return obj;
-        var newObject = Object.create(proto);
-        Object.getOwnPropertyNames(obj).forEach(function(name) {
-          Object.defineProperty(newObject, name,
-                               Object.getOwnPropertyDescriptor(obj, name));
-        });
-        return newObject;
-      };
-
-  // IE does not support have Document.prototype.contains.
-  if (typeof document.contains != 'function') {
-    Document.prototype.contains = function(node) {
-      if (node === this || node.parentNode === this)
-        return true;
-      return this.documentElement.contains(node);
-    }
-  }
 
   Node.prototype.bind = function(name, observable) {
     console.error('Unhandled binding to Node: ', this, name, observable);
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index e7a2a21..d8b6a8c 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -8,6 +8,7 @@
     "../ShadowDOM/src/wrappers.js",
     "../ShadowDOM/src/microtask.js",
     "../ShadowDOM/src/MutationObserver.js",
+    "../ShadowDOM/src/TreeScope.js",
     "../ShadowDOM/src/wrappers/events.js",
     "../ShadowDOM/src/wrappers/NodeList.js",
     "../ShadowDOM/src/wrappers/HTMLCollection.js",
@@ -94,6 +95,7 @@
     "../PointerGestures/src/flick.js",
     "../PointerGestures/src/pinch.js",
     "../PointerGestures/src/tap.js",
+    "../PointerGestures/src/registerScopes.js",
     "../NodeBind/src/NodeBind.js",
     "../TemplateBinding/src/TemplateBinding.js",
     "../polymer-expressions/third_party/esprima/esprima.js",
@@ -101,24 +103,25 @@
     "src/patches-mdv.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5kDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACryBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9pBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oB;ACzqBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;AC1DA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oB;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5gCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACztBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oB;ACzsBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;AC1DA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oB;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5gCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var PROP_ADD_TYPE = 'add';\n  var PROP_UPDATE_TYPE = 'update';\n  var PROP_RECONFIGURE_TYPE = 'reconfigure';\n  var PROP_DELETE_TYPE = 'delete';\n  var ARRAY_SPLICE_TYPE = 'splice';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    Object.observe(test, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 3)\n      return false;\n\n    // TODO(rafaelw): Remove this when new change record type names make it to\n    // chrome release.\n    if (records[0].type == 'new' &&\n        records[1].type == 'updated' &&\n        records[2].type == 'deleted') {\n      PROP_ADD_TYPE = 'new';\n      PROP_UPDATE_TYPE = 'updated';\n      PROP_RECONFIGURE_TYPE = 'reconfigured';\n      PROP_DELETE_TYPE = 'deleted';\n    } else if (records[0].type != 'add' ||\n               records[1].type != 'update' ||\n               records[2].type != 'delete') {\n      console.error('Unexpected change record names for Object.observe. ' +\n                    'Using dirty-checking instead');\n      return false;\n    }\n    Object.unobserve(test, callback);\n\n    test = [0];\n    Array.observe(test, callback);\n    test[1] = 1;\n    test.length = 0;\n    Object.deliverChangeRecords(callback);\n    if (records.length != 2)\n      return false;\n    if (records[0].type != ARRAY_SPLICE_TYPE ||\n        records[1].type != ARRAY_SPLICE_TYPE) {\n      return false;\n    }\n    Array.unobserve(test, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // don't test for eval if document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!obj)\n          return;\n        observe(obj);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!isObject(obj))\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(reset);\n    }\n\n    function callback() {\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n\n      scheduleReset();\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        observedSetCache.push(this);\n      },\n      reset: scheduleReset\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = typeof Object.deliverAllChangeRecords == 'function';\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      Object.deliverAllChangeRecords();\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = path instanceof Path ? path : getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver() {\n    Observer.call(this);\n\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\n      var object;\n      var needsDirectObserver = false;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel) {\n          needsDirectObserver = true;\n          break;\n        }\n      }\n\n      if (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n\n      this.closeObservers_();\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.closeObservers_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {};\n  expectedRecordTypes[PROP_ADD_TYPE] = true;\n  expectedRecordTypes[PROP_UPDATE_TYPE] = true;\n  expectedRecordTypes[PROP_DELETE_TYPE] = true;\n\n  function notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify(PROP_UPDATE_TYPE, oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == PROP_UPDATE_TYPE)\n        continue;\n\n      if (record.type == PROP_ADD_TYPE) {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case ARRAY_SPLICE_TYPE:\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case PROP_ADD_TYPE:\n        case PROP_UPDATE_TYPE:\n        case PROP_DELETE_TYPE:\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n\n  // TODO(rafaelw): Only needed for testing until new change record names\n  // make it to release.\n  global.Observer.changeRecordTypes = {\n    add: PROP_ADD_TYPE,\n    update: PROP_UPDATE_TYPE,\n    reconfigure: PROP_RECONFIGURE_TYPE,\n    'delete': PROP_DELETE_TYPE,\n    splice: ARRAY_SPLICE_TYPE\n  };\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var PROP_ADD_TYPE = 'add';\n  var PROP_UPDATE_TYPE = 'update';\n  var PROP_RECONFIGURE_TYPE = 'reconfigure';\n  var PROP_DELETE_TYPE = 'delete';\n  var ARRAY_SPLICE_TYPE = 'splice';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    Object.observe(test, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 3)\n      return false;\n\n    // TODO(rafaelw): Remove this when new change record type names make it to\n    // chrome release.\n    if (records[0].type == 'new' &&\n        records[1].type == 'updated' &&\n        records[2].type == 'deleted') {\n      PROP_ADD_TYPE = 'new';\n      PROP_UPDATE_TYPE = 'updated';\n      PROP_RECONFIGURE_TYPE = 'reconfigured';\n      PROP_DELETE_TYPE = 'deleted';\n    } else if (records[0].type != 'add' ||\n               records[1].type != 'update' ||\n               records[2].type != 'delete') {\n      console.error('Unexpected change record names for Object.observe. ' +\n                    'Using dirty-checking instead');\n      return false;\n    }\n    Object.unobserve(test, callback);\n\n    test = [0];\n    Array.observe(test, callback);\n    test[1] = 1;\n    test.length = 0;\n    Object.deliverChangeRecords(callback);\n    if (records.length != 2)\n      return false;\n    if (records[0].type != ARRAY_SPLICE_TYPE ||\n        records[1].type != ARRAY_SPLICE_TYPE) {\n      return false;\n    }\n    Array.unobserve(test, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // don't test for eval if document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!obj)\n          return;\n        observe(obj);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!isObject(obj))\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduledReset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      reset();\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(scheduledReset);\n    }\n\n    function callback() {\n      reset();\n\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        observedSetCache.push(this);\n      },\n      reset: scheduleReset\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = typeof Object.deliverAllChangeRecords == 'function';\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      Object.deliverAllChangeRecords();\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = path instanceof Path ? path : getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver() {\n    Observer.call(this);\n\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\n      var object;\n      var needsDirectObserver = false;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel) {\n          needsDirectObserver = true;\n          break;\n        }\n      }\n\n      if (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n\n      this.closeObservers_();\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.closeObservers_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {};\n  expectedRecordTypes[PROP_ADD_TYPE] = true;\n  expectedRecordTypes[PROP_UPDATE_TYPE] = true;\n  expectedRecordTypes[PROP_DELETE_TYPE] = true;\n\n  function notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify(PROP_UPDATE_TYPE, oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == PROP_UPDATE_TYPE)\n        continue;\n\n      if (record.type == PROP_ADD_TYPE) {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case ARRAY_SPLICE_TYPE:\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case PROP_ADD_TYPE:\n        case PROP_UPDATE_TYPE:\n        case PROP_DELETE_TYPE:\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n\n  // TODO(rafaelw): Only needed for testing until new change record names\n  // make it to release.\n  global.Observer.changeRecordTypes = {\n    add: PROP_ADD_TYPE,\n    update: PROP_UPDATE_TYPE,\n    reconfigure: PROP_RECONFIGURE_TYPE,\n    'delete': PROP_DELETE_TYPE,\n    splice: ARRAY_SPLICE_TYPE\n  };\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript || document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = (flags.shadow || flags.shadowdom || flags.polyfill);\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\n// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n",
-    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    GeneratedWrapper.prototype =\n        Object.create(superWrapperConstructor.prototype);\n    GeneratedWrapper.prototype.constructor = GeneratedWrapper;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function rootOfNode(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n    return node;\n  }\n\n  function inSameTree(a, b) {\n    return rootOfNode(a) === rootOfNode(b);\n  }\n\n  function enclosedBy(a, b) {\n    if (a === b)\n      return true;\n    if (a instanceof wrappers.ShadowRoot)\n      return enclosedBy(rootOfNode(a.host), b);\n    return false;\n  }\n\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n\n    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window load events the load event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (event.type === 'load' &&\n        eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (originalEvent.relatedTarget) {\n        var relatedTarget = wrap(originalEvent.relatedTarget);\n\n        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n        if (adjusted === target)\n          return true;\n\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent)\n      this.impl = type;\n    else\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = rootOfNode(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = rootOfNode(currentTarget);\n          if (enclosedBy(baseRoot, currentRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      return relatedTargetTable.get(this) || wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.adjustRelatedTarget = adjustRelatedTarget;\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n\n    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window load events the load event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (event.type === 'load' &&\n        eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (originalEvent.relatedTarget) {\n        var relatedTarget = wrap(originalEvent.relatedTarget);\n\n        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n        if (adjusted === target)\n          return true;\n\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent)\n      this.impl = type;\n    else\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      return relatedTargetTable.get(this) || wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.adjustRelatedTarget = adjustRelatedTarget;\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node) {\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i]);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    // Nothing at this point in time.\n  }\n\n  function nodesWereRemoved(nodes) {\n    // Nothing at this point in time.\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      if (!child)\n        return false;\n\n      child = wrapIfNeeded(child);\n\n      // TODO(arv): Optimize using ownerDocument etc.\n      if (child === this)\n        return true;\n      var parentNode = child.parentNode;\n      if (!parentNode)\n        return false;\n      return this.contains(parentNode);\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl, unwrap(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n  scope.cloneNode = cloneNode;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl, unwrap(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n",
@@ -139,15 +142,15 @@
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      pendingDirtyRenderers[i].render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    for (; node; node = node.parentNode) {\n      if (node instanceof ShadowRoot)\n        return node;\n    }\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        // renderNode.skip = !renderer.dirty;\n        renderer.invalidate();\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype = object.prototype;\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (object.extends)\n        p.extends = object.extends;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (object.extends) {\n            return document.createElement(object.extends, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype = object.prototype;\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (object.extends)\n        p.extends = object.extends;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (object.extends) {\n            return document.createElement(object.extends, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n  });\n\n  registerWrapper(OriginalWindow, Window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n})();\n",
-    "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :ancestor: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName, ownSheet) {\n    var typeExtension = this.isTypeExtension(extendsName);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var def = this.registerDefinition(root, name, extendsName);\n    // find styles and apply shimming...\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    var cssText = this.stylesToShimmedCssText(def.rootStyles, def.scopeStyles,\n        name, typeExtension);\n    // provide shimmedStyle for user extensibility\n    def.shimmedStyle = cssTextToStyle(cssText);\n    if (root) {\n      root.shimmedStyle = def.shimmedStyle;\n    }\n    // remove existing style elements\n    for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]); \n        i++) {\n      s.parentNode.removeChild(s);\n    }\n    // add style to document\n    if (ownSheet) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  },\n  // apply @polyfill rules + :host and scope shimming\n  stylesToShimmedCssText: function(rootStyles, scopeStyles, name,\n      typeExtension) {\n    name = name || '';\n    // insert @polyfill and @polyfill-rule rules into style elements\n    // scoping process takes care of shimming these\n    this.insertPolyfillDirectives(rootStyles);\n    this.insertPolyfillRules(rootStyles);\n    var cssText = this.shimScoping(scopeStyles, name, typeExtension);\n    // note: we only need to do rootStyles since these are unscoped.\n    cssText += this.extractPolyfillUnscopedRules(rootStyles);\n    return cssText.trim();\n  },\n  registerDefinition: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = root ? root.querySelectorAll('style') : [];\n    styles = styles ? Array.prototype.slice.call(styles, 0) : [];\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee && (!root || root.querySelector('shadow'))) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with comments.\n   * \n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill :host menu-item (comment end)\n   * shadow::-webkit-distributed(menu-item) {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectives: function(styles) {\n    if (styles) {\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = this.insertPolyfillDirectivesInCssText(s.textContent);\n      }, this);\n    }\n  },\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    return cssText.replace(cssPolyfillCommentRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-rule :host menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRules: function(styles) {\n    if (styles) {\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = this.insertPolyfillRulesInCssText(s.textContent);\n      }, this);\n    }\n  },\n  insertPolyfillRulesInCssText: function(cssText) {\n    return cssText.replace(cssPolyfillRuleCommentRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractPolyfillUnscopedRules: function(styles) {\n    var cssText = '';\n    if (styles) {\n      Array.prototype.forEach.call(styles, function(s) {\n        cssText += this.extractPolyfillUnscopedRulesFromCssText(\n            s.textContent) + '\\n\\n';\n      }, this);\n    }\n    return cssText;\n  },\n  extractPolyfillUnscopedRulesFromCssText: function(cssText) {\n    var r = '', matches;\n    while (matches = cssPolyfillUnscopedRuleCommentRe.exec(cssText)) {\n      r += matches[1].slice(0, -1) + '\\n\\n';\n    }\n    return r;\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  shimScoping: function(styles, name, typeExtension) {\n    if (styles) {\n      return this.convertScopedStyles(styles, name, typeExtension);\n    }\n  },\n  convertScopedStyles: function(styles, name, typeExtension) {\n    var cssText = stylesToCssText(styles);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonAncestor(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (name) {\n      var self = this, cssText;\n      \n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, name, typeExtension);\n      });\n\n    }\n    return cssText;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :ancestor(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :ancestor(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonAncestor: function(cssText) {\n    return this.convertColonRule(cssText, cssColonAncestorRe,\n        this.colonAncestorPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonAncestorPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    return cssText.replace(/\\^\\^/g, ' ').replace(/\\^/g, ' ');\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, name, typeExtension) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, name, typeExtension, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, name, typeExtension);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, name, typeExtension, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, name, typeExtension)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, name) :\n            this.applySimpleSelectorScope(p, name, typeExtension);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, name, typeExtension) {\n    var re = this.makeScopeMatcher(name, typeExtension);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(name, typeExtension) {\n    var matchScope = typeExtension ? '\\\\[is=[\\'\"]?' + name + '[\\'\"]?\\\\]' : name;\n    return new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, name, typeExtension) {\n    var scoper = typeExtension ? '[is=' + name + ']' : name;\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scoper);\n      return selector.replace(polyfillHostRe, scoper + ' ');\n    } else {\n      return scoper + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, name) {\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + name + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(hostRe, polyfillHost).replace(colonHostRe,\n        polyfillHost).replace(colonAncestorRe, polyfillAncestor);\n  },\n  propertiesFromRule: function(rule) {\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    if (rule.style.content && !rule.style.content.match(/['\"]+/)) {\n      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    return rule.style.cssText;\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    cssPolyfillCommentRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssPolyfillRuleCommentRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssPolyfillUnscopedRuleCommentRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :ancestor pre-processed to -shadowcssancestor.\n    polyfillAncestor = '-shadowcssancestor',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    hostRe = /@host/gim,\n    colonHostRe = /\\:host/gim,\n    colonAncestorRe = /\\:ancestor/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim');\n    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        var styles = [style];\n        style.textContent = ShadowCSS.stylesToShimmedCssText(styles, styles);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);",
+    "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :ancestor: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee && (!root || root.querySelector('shadow'))) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonAncestor(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :ancestor(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :ancestor(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonAncestor: function(cssText) {\n    return this.convertColonRule(cssText, cssColonAncestorRe,\n        this.colonAncestorPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonAncestorPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    return cssText.replace(/\\^\\^/g, ' ').replace(/\\^/g, ' ');\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySimpleSelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(hostRe, polyfillHost).replace(colonHostRe,\n        polyfillHost).replace(colonAncestorRe, polyfillAncestor);\n  },\n  propertiesFromRule: function(rule) {\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    if (rule.style.content && !rule.style.content.match(/['\"]+/)) {\n      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    return rule.style.cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :ancestor pre-processed to -shadowcssancestor.\n    polyfillAncestor = '-shadowcssancestor',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    hostRe = /@host/gim,\n    colonHostRe = /\\:host/gim,\n    colonAncestorRe = /\\:ancestor/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);",
     "} else {",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  var originalCreateShadowRoot = Element.prototype.webkitCreateShadowRoot;\n  Element.prototype.webkitCreateShadowRoot = function() {\n    var elderRoot = this.webkitShadowRoot;\n    var root = originalCreateShadowRoot.call(this);\n    root.olderShadowRoot = elderRoot;\n    root.host = this;\n    CustomElements.watchShadow(this);\n    return root;\n  }\n\n  Object.defineProperties(Element.prototype, {\n    shadowRoot: {\n      get: function() {\n        return this.webkitShadowRoot;\n      }\n    },\n    createShadowRoot: {\n      value: function() {\n        return this.webkitCreateShadowRoot();\n      }\n    }\n  });\n\n  window.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})();",
     "}",
@@ -177,25 +180,26 @@
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  scope = scope || {};\n  scope.external = scope.external || {};\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    }\n  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n  function shadowSelector(v) {\n    return 'body ^^ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; touch-action-delay: none; }';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    }\n  ];\n  var styles = '';\n  attrib2css.forEach(function(r) {\n    if (String(r) === r) {\n      styles += selector(r) + rule(r) + '\\n';\n      styles += shadowSelector(r) + rule(r) + '\\n';\n    } else {\n      styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n      styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n    }\n  });\n  var el = document.createElement('style');\n  el.textContent = styles;\n  document.head.appendChild(el);\n})();\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n  // test for DOM Level 4 Events\n  var NEW_MOUSE_EVENT = false;\n  var HAS_BUTTONS = false;\n  try {\n    var ev = new MouseEvent('click', {buttons: 1});\n    NEW_MOUSE_EVENT = true;\n    HAS_BUTTONS = ev.buttons === 1;\n  } catch(e) {\n  }\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null\n  ];\n\n  function PointerEvent(inType, inDict) {\n    inDict = inDict || {};\n    // According to the w3c spec,\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button\n    // MouseEvent.button == 0 can mean either no mouse button depressed, or the\n    // left mouse button depressed.\n    //\n    // As of now, the only way to distinguish between the two states of\n    // MouseEvent.button is by using the deprecated MouseEvent.which property, as\n    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that\n    // no mouse button is held.\n    //\n    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,\n    // but initMouseEvent does not expose an argument with which to set\n    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set\n    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations\n    // of app developers.\n    //\n    // The only way to propagate the correct state of MouseEvent.which and\n    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0\n    // is to call initMouseEvent with a buttonArg value of -1.\n    //\n    // This is fixed with DOM Level 4's use of buttons\n    var buttons;\n    if (inDict.buttons || HAS_BUTTONS) {\n      buttons = inDict.buttons;\n    } else {\n      switch (inDict.which) {\n        case 1: buttons = 1; break;\n        case 2: buttons = 4; break;\n        case 3: buttons = 2; break;\n        default: buttons = 0;\n      }\n    }\n\n    var e;\n    if (NEW_MOUSE_EVENT) {\n      e = new MouseEvent(inType, inDict);\n    } else {\n      e = document.createEvent('MouseEvent');\n\n      // import values from the given dictionary\n      var props = {}, p;\n      for(var i = 0; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        props[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n\n      // define the properties inherited from MouseEvent\n      e.initMouseEvent(\n        inType, props.bubbles, props.cancelable, props.view, props.detail,\n        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,\n        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget\n      );\n    }\n\n    // make the event pass instanceof checks\n    e.__proto__ = PointerEvent.prototype;\n\n    // define the buttons property according to DOM Level 3 spec\n    if (!HAS_BUTTONS) {\n      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting\n      // mechanism\n      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});\n    }\n\n    // Spec requires that pointers without pressure specified use 0.5 for down\n    // state and 0 for up state.\n    var pressure = 0;\n    if (inDict.pressure) {\n      pressure = inDict.pressure;\n    } else {\n      pressure = buttons ? 0.5 : 0;\n    }\n\n    // define the properties of the PointerEvent interface\n    Object.defineProperties(e, {\n      pointerId: { value: inDict.pointerId || 0, enumerable: true },\n      width: { value: inDict.width || 0, enumerable: true },\n      height: { value: inDict.height || 0, enumerable: true },\n      pressure: { value: pressure, enumerable: true },\n      tiltX: { value: inDict.tiltX || 0, enumerable: true },\n      tiltY: { value: inDict.tiltY || 0, enumerable: true },\n      pointerType: { value: inDict.pointerType || '', enumerable: true },\n      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },\n      isPrimary: { value: inDict.isPrimary || false, enumerable: true }\n    });\n    return e;\n  }\n\n  // PointerEvent extends MouseEvent\n  PointerEvent.prototype = Object.create(MouseEvent.prototype);\n\n  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n  // test for DOM Level 4 Events\n  var NEW_MOUSE_EVENT = false;\n  var HAS_BUTTONS = false;\n  try {\n    var ev = new MouseEvent('click', {buttons: 1});\n    NEW_MOUSE_EVENT = true;\n    HAS_BUTTONS = ev.buttons === 1;\n    ev = null;\n  } catch(e) {\n  }\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null\n  ];\n\n  function PointerEvent(inType, inDict) {\n    inDict = inDict || {};\n    // According to the w3c spec,\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button\n    // MouseEvent.button == 0 can mean either no mouse button depressed, or the\n    // left mouse button depressed.\n    //\n    // As of now, the only way to distinguish between the two states of\n    // MouseEvent.button is by using the deprecated MouseEvent.which property, as\n    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that\n    // no mouse button is held.\n    //\n    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,\n    // but initMouseEvent does not expose an argument with which to set\n    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set\n    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations\n    // of app developers.\n    //\n    // The only way to propagate the correct state of MouseEvent.which and\n    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0\n    // is to call initMouseEvent with a buttonArg value of -1.\n    //\n    // This is fixed with DOM Level 4's use of buttons\n    var buttons = inDict.buttons;\n    // touch has two possible buttons state: 0 and 1, rely on being told the right one\n    if (!HAS_BUTTONS && !buttons && inType !== 'touch') {\n      switch (inDict.which) {\n        case 1: buttons = 1; break;\n        case 2: buttons = 4; break;\n        case 3: buttons = 2; break;\n        default: buttons = 0;\n      }\n    }\n\n    var e;\n    if (NEW_MOUSE_EVENT) {\n      e = new MouseEvent(inType, inDict);\n    } else {\n      e = document.createEvent('MouseEvent');\n\n      // import values from the given dictionary\n      var props = {}, p;\n      for(var i = 0; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        props[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n\n      // define the properties inherited from MouseEvent\n      e.initMouseEvent(\n        inType, props.bubbles, props.cancelable, props.view, props.detail,\n        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,\n        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget\n      );\n    }\n\n    // make the event pass instanceof checks\n    e.__proto__ = PointerEvent.prototype;\n\n    // define the buttons property according to DOM Level 3 spec\n    if (!HAS_BUTTONS) {\n      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting\n      // mechanism\n      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});\n    }\n\n    // Spec requires that pointers without pressure specified use 0.5 for down\n    // state and 0 for up state.\n    var pressure = 0;\n    if (inDict.pressure) {\n      pressure = inDict.pressure;\n    } else {\n      pressure = buttons ? 0.5 : 0;\n    }\n\n    // define the properties of the PointerEvent interface\n    Object.defineProperties(e, {\n      pointerId: { value: inDict.pointerId || 0, enumerable: true },\n      width: { value: inDict.width || 0, enumerable: true },\n      height: { value: inDict.height || 0, enumerable: true },\n      pressure: { value: pressure, enumerable: true },\n      tiltX: { value: inDict.tiltX || 0, enumerable: true },\n      tiltY: { value: inDict.tiltY || 0, enumerable: true },\n      pointerType: { value: inDict.pointerType || '', enumerable: true },\n      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },\n      isPrimary: { value: inDict.isPrimary || false, enumerable: true }\n    });\n    return e;\n  }\n\n  // PointerEvent extends MouseEvent\n  PointerEvent.prototype = Object.create(MouseEvent.prototype);\n\n  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    targets: new WeakMap(),\n    handledEvents: new WeakMap(),\n    pointermap: new scope.PointerMap(),\n    eventMap: {},\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: {},\n    eventSourceList: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.removeEvent || function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\n      this.targets.set(e, this.targets.get(inEvent) || inEvent.target);\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      if (this.captureInfo) {\n        if (this.captureInfo.id === inEvent.pointerId) {\n          return this.captureInfo.target;\n        }\n      }\n      return this.targets.get(inEvent);\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo) {\n        this.releaseCapture(this.captureInfo.id);\n      }\n      this.captureInfo = {id: inPointerId, target: inTarget};\n      var e = new PointerEvent('gotpointercapture', { bubbles: true });\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      this.targets.set(e, inTarget);\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      if (this.captureInfo && this.captureInfo.id === inPointerId) {\n        var e = new PointerEvent('lostpointercapture', { bubbles: true });\n        var t = this.captureInfo.target;\n        this.captureInfo = null;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        this.targets.set(e, t);\n        this.asyncDispatchEvent(e);\n      }\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      setTimeout(this.dispatchEvent.bind(this, inEvent), 0);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('DOMContentLoaded', this.installNewSubtree.bind(this, document));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup',\n      'mouseover',\n      'mouseout'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var findTarget = scope.findTarget;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = false;\n  \n  // handler block for native touch events\n  var touchEvents = {\n    scrollType: new WeakMap(),\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        this.scrollType.set(el, st);\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      this.scrollType['delete'](el);\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        this.scrollType['delete'](s);\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        this.scrollType.set(el, st);\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    touchToPointer: function(inTouch) {\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      e.pointerId = inTouch.identifier + 2;\n      e.target = findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\n      e.buttons = 1;\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      var pointers = touchMap(tl, this.touchToPointer, this);\n      // forward touch preventDefaults\n      pointers.forEach(function(p) {\n        p.preventDefault = function() {\n          this.scrolling = false;\n          this.firstXY = null;\n          inEvent.preventDefault();\n        };\n      }, this);\n      pointers.forEach(inFunction, this);\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = this.scrollType.get(inEvent.currentTarget);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(this.touchToPointer(p));\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (!this.scrolling) {\n        if (this.shouldScroll(inEvent)) {\n          this.scrolling = true;\n          this.touchcancel(inEvent);\n        } else {\n          inEvent.preventDefault();\n          this.processTouches(inEvent, this.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var findTarget = scope.findTarget;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = false;\n  \n  // handler block for native touch events\n  var touchEvents = {\n    scrollType: new WeakMap(),\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        this.scrollType.set(el, st);\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      this.scrollType['delete'](el);\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        this.scrollType['delete'](s);\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        this.scrollType.set(el, st);\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    touchToPointer: function(inTouch) {\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      e.pointerId = inTouch.identifier + 2;\n      e.target = findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\n      e.buttons = this.typeToButtons(this.currentTouchEvent);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent.type;\n      var pointers = touchMap(tl, this.touchToPointer, this);\n      // forward touch preventDefaults\n      pointers.forEach(function(p) {\n        p.preventDefault = function() {\n          this.scrolling = false;\n          this.firstXY = null;\n          inEvent.preventDefault();\n        };\n      }, this);\n      pointers.forEach(inFunction, this);\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = this.scrollType.get(inEvent.currentTarget);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(this.touchToPointer(p));\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (!this.scrolling) {\n        if (this.shouldScroll(inEvent)) {\n          this.scrolling = true;\n          this.touchcancel(inEvent);\n        } else {\n          inEvent.preventDefault();\n          this.processTouches(inEvent, this.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  // only activate if this platform does not have pointer events\n  if (window.navigator.pointerEnabled === undefined) {\n    Object.defineProperty(window.navigator, 'pointerEnabled', {value: true, enumerable: true});\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\n      dispatcher.registerSource('ms', scope.msEvents);\n    } else {\n      dispatcher.registerSource('mouse', scope.mouseEvents);\n      if (window.ontouchstart !== undefined) {\n        dispatcher.registerSource('touch', scope.touchEvents);\n      }\n    }\n\n    dispatcher.register(document);\n  }\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\n};\n\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  /**\n   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\n        }\n        var adepth = this.depth(a);\n        var bdepth = this.depth(b);\n        var d = adepth - bdepth;\n        if (d > 0) {\n          a = this.walk(a, d);\n        } else {\n          b = this.walk(b, -d);\n        }\n        while(a && b && a !== b) {\n          a = this.walk(a, 1);\n          b = this.walk(b, 1);\n        }\n        return a;\n      },\n      walk: function(n, u) {\n        for (var i = 0; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PointerGestures);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0\n  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      var fn = function() {\n        this.dispatchEvent(inEvent, inTarget);\n      }.bind(this);\n      setTimeout(fn, 0);\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  var registerQueue = [];\n  var immediateRegister = false;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      registerQueue.push(inScope);\n    }\n  };\n  // wait to register scopes until recognizers load\n  document.addEventListener('DOMContentLoaded', function() {\n    immediateRegister = true;\n    registerQueue.push(document);\n    registerQueue.forEach(scope.register);\n  });\n})(window.PointerGestures);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0\n  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      var fn = function() {\n        this.dispatchEvent(inEvent, inTarget);\n      }.bind(this);\n      setTimeout(fn, 0);\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  // recognizers call into the dispatcher and load later\n  // solve the chicken and egg problem by having registerScopes module run last\n  dispatcher.registerQueue = [];\n  dispatcher.immediateRegister = false;\n  scope.dispatcher = dispatcher;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (dispatcher.immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      dispatcher.registerQueue.push(inScope);\n    }\n  };\n  scope.register(document);\n})(window.PointerGestures);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     pointermove: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n       }\n     },\n     pointerup: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     },\n     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      var points = {};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e) {\n      if (!e.tapPrevented) {\n        // only allow left click to tap for mouse\n        return e.pointerType === 'mouse' ? e.buttons === 1 : true;\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\n",
-    "// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  function unbind(node, name) {\n    var bindings = node.bindings;\n    if (!bindings) {\n      node.bindings = {};\n      return;\n    }\n\n    var binding = bindings[name];\n    if (!binding)\n      return;\n\n    binding.close();\n    bindings[name] = undefined;\n  }\n\n  Node.prototype.unbind = function(name) {\n    unbind(this, name);\n  };\n\n  Node.prototype.unbindAll = function() {\n    if (!this.bindings)\n      return;\n    var names = Object.keys(this.bindings);\n    for (var i = 0; i < names.length; i++) {\n      var binding = this.bindings[names[i]];\n      if (binding)\n        binding.close();\n    }\n\n    this.bindings = {};\n  };\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    unbind(this, 'textContent');\n    updateText(this, value.open(textBinding(this)));\n    return this.bindings.textContent = value;\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n    unbind(this, name);\n    updateAttribute(this, name, conditional,\n        value.open(attributeBinding(this, name, conditional)));\n\n    return this.bindings[name] = value;\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    var capturedClose = observable.close;\n    observable.close = function() {\n      if (!capturedClose)\n        return;\n      input.removeEventListener(eventType, eventHandler);\n\n      observable.close = capturedClose;\n      observable.close();\n      capturedClose = undefined;\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value, postEventFn);\n    updateInput(this, name,\n                value.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    return this.bindings[name] = value;\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateInput(this, 'value',\n                value.open(inputBinding(this, 'value', sanitizeValue)));\n\n    return this.bindings.value = value;\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings &&\n        parentNode.bindings.value) {\n      select = parentNode;\n      selectBinding = select.bindings.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.setValue(select.value);\n      selectBinding.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateOption(this, value.open(optionBinding(this)));\n    return this.bindings.value = value;\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value);\n    updateInput(this, name,\n                value.open(inputBinding(this, name)));\n    return this.bindings[name] = value;\n  }\n})(this);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (!e.tapPrevented) {\n        if (e.pointerType === 'mouse') {\n          // only allow left click to tap for mouse\n          return downState.buttons === 1;\n        } else {\n          return true;\n        }\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\n",
+    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Because recognizers are loaded after dispatcher, we have to wait to register\n * scopes until after all the recognizers.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  function registerScopes() {\n    dispatcher.immediateRegister = true;\n    var rq = dispatcher.registerQueue;\n    rq.forEach(scope.register);\n    rq.length = 0;\n  }\n  if (document.readyState === 'complete') {\n    registerScopes();\n  } else {\n    // register scopes after a steadystate is reached\n    // less MutationObserver churn\n    document.addEventListener('readystatechange', function() {\n      if (document.readyState === 'complete') {\n        registerScopes();\n      }\n    });\n  }\n})(window.PointerGestures);\n",
+    "// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  function unbind(node, name) {\n    var bindings = node.bindings;\n    if (!bindings) {\n      node.bindings = {};\n      return;\n    }\n\n    var binding = bindings[name];\n    if (!binding)\n      return;\n\n    binding.close();\n    bindings[name] = undefined;\n  }\n\n  Node.prototype.unbind = function(name) {\n    unbind(this, name);\n  };\n\n  Node.prototype.unbindAll = function() {\n    if (!this.bindings)\n      return;\n    var names = Object.keys(this.bindings);\n    for (var i = 0; i < names.length; i++) {\n      var binding = this.bindings[names[i]];\n      if (binding)\n        binding.close();\n    }\n\n    this.bindings = {};\n  };\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    unbind(this, 'textContent');\n    updateText(this, value.open(textBinding(this)));\n    return this.bindings.textContent = value;\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n    unbind(this, name);\n    updateAttribute(this, name, conditional,\n        value.open(attributeBinding(this, name, conditional)));\n\n    return this.bindings[name] = value;\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    var capturedClose = observable.close;\n    observable.close = function() {\n      if (!capturedClose)\n        return;\n      input.removeEventListener(eventType, eventHandler);\n\n      observable.close = capturedClose;\n      observable.close();\n      capturedClose = undefined;\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value, postEventFn);\n    updateInput(this, name,\n                value.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    return this.bindings[name] = value;\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateInput(this, 'value',\n                value.open(inputBinding(this, 'value', sanitizeValue)));\n\n    return this.bindings.value = value;\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings &&\n        parentNode.bindings.value) {\n      select = parentNode;\n      selectBinding = select.bindings.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.setValue(select.value);\n      selectBinding.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateOption(this, value.open(optionBinding(this)));\n    return this.bindings.value = value;\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value);\n    updateInput(this, name,\n                value.open(inputBinding(this, name)));\n    return this.bindings[name] = value;\n  }\n})(this);\n",
     "// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      this.unbind('ref');\n      return this.bindings.ref = value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n          this.bindings.iterator = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n        this.bindings = this.bindings || {};\n        this.bindings.iterator = this.iterator_;\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_,\n                             instanceBindings_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      var map = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n\n      var instanceRecord = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instanceBindings_);\n        clone.templateInstance_ = instanceRecord;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      this.bindings_ = undefined;\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return {};\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      tokens.push(Path.get(pathString)); // PATH\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n\n    // Flattened array of tuples:\n    //   <instanceTerminatorNode, [bindingsSetupByInstance]>\n    this.terminators = [];\n\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getTerminatorAt: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var terminator = this.terminators[index*2];\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subIterator = terminator.iterator_;\n      if (!subIterator)\n        return terminator;\n\n      return subIterator.getTerminatorAt(subIterator.terminators.length/2 - 1);\n    },\n\n    // TODO(rafaelw): If we inserting sequences of instances we can probably\n    // avoid lots of calls to getTerminatorAt(), or cache its result.\n    insertInstanceAt: function(index, fragment, instanceNodes,\n                               instanceBindings) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = previousTerminator;\n      if (fragment)\n        terminator = fragment.lastChild || terminator;\n      else if (instanceNodes)\n        terminator = instanceNodes[instanceNodes.length - 1] || terminator;\n\n      this.terminators.splice(index*2, 0, terminator, instanceBindings);\n      var parent = this.templateElement_.parentNode;\n      var insertBeforeNode = previousTerminator.nextSibling;\n\n      if (fragment) {\n        parent.insertBefore(fragment, insertBeforeNode);\n      } else if (instanceNodes) {\n        for (var i = 0; i < instanceNodes.length; i++)\n          parent.insertBefore(instanceNodes[i], insertBeforeNode);\n      }\n    },\n\n    extractInstanceAt: function(index) {\n      var instanceNodes = [];\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      instanceNodes.instanceBindings = this.terminators[index*2 + 1];\n      this.terminators.splice(index*2, 2);\n\n      var parent = this.templateElement_.parentNode;\n      while (terminator !== previousTerminator) {\n        var node = previousTerminator.nextSibling;\n        if (node == terminator)\n          terminator = previousTerminator;\n\n        parent.removeChild(node);\n        instanceNodes.push(node);\n      }\n\n      return instanceNodes;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      splices.forEach(function(splice) {\n        splice.removed.forEach(function(model) {\n          var instanceNodes =\n              this.extractInstanceAt(splice.index + removeDelta);\n          instanceCache.set(model, instanceNodes);\n        }, this);\n\n        removeDelta -= splice.addedCount;\n      }, this);\n\n      splices.forEach(function(splice) {\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var fragment = undefined;\n          var instanceNodes = instanceCache.get(model);\n          var instanceBindings;\n          if (instanceNodes) {\n            instanceCache.delete(model);\n            instanceBindings = instanceNodes.instanceBindings;\n          } else {\n            instanceBindings = [];\n            if (this.instanceModelFn_)\n              model = this.instanceModelFn_(model);\n\n            if (model !== undefined) {\n              fragment = template.createInstance(model, undefined, delegate,\n                                                 instanceBindings);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, fragment, instanceNodes,\n                                instanceBindings);\n        }\n      }, this);\n\n      instanceCache.forEach(function(instanceNodes) {\n        this.closeInstanceBindings(instanceNodes.instanceBindings);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      if (previousTerminator === terminator)\n        return; // instance has zero nodes.\n\n      // We must use the first node of the instance, because any subsequent\n      // nodes may have been generated by sub-templates.\n      // TODO(rafaelw): This is brittle WRT instance mutation -- e.g. if the\n      // first node was removed by script.\n      var templateInstance = previousTerminator.nextSibling.templateInstance;\n      this.instancePositionChangedFn_(templateInstance, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.terminators.length / 2;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instanceBindings) {\n      for (var i = 0; i < instanceBindings.length; i++) {\n        instanceBindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 1; i < this.terminators.length; i += 2) {\n        this.closeInstanceBindings(this.terminators[i]);\n      }\n\n      this.terminators.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
     "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
     "// Copyright 2013 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function (global) {\n  'use strict';\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (this.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\n            if (observer)\n              observer.addPath(context, propName);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(value, toModelDirection, filterRegistry, model,\n                        observer) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer) {\n        return unaryOperators[op](argument(model, observer));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      this.getValue(model, observer, filterRegistry);  // captures deps.\n      var self = this;\n\n      function valueFn() {\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(newValue, true, filterRegistry,\n                                                 model);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\n  }\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\n\n      if (path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          }\n        }\n\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\n})(this);\n",
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index 831fa3d..d48fd19 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -28,11 +28,11 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-// @version: 0.2.0-96340d3
-function PointerGestureEvent(a,b){var c=b||{},d=document.createEvent("Event"),e={bubbles:Boolean(c.bubbles)===c.bubbles||!0,cancelable:Boolean(c.cancelable)===c.cancelable||!0};d.initEvent(a,e.bubbles,e.cancelable);for(var f,g=Object.keys(c),h=0;h<g.length;h++)f=g[h],d[f]=c[f];return d.preventTap=this.preventTap,d}"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)L="new",M="updated",N="reconfigured",O="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=P||b[1].type!=P?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:S(a)&&S(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:$.test(a))}function i(a,b){if(b!==_)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(R&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=ab[a];if(b)return b;if(!h(a))return bb;var b=new i(a,_);return ab[a]=b,b}function k(b){for(var c=0;db>c&&b.check_();)c++;return a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c),c>0}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(){if(!eb.length)return!1;for(var a=0;a<eb.length;a++)eb[a]();return eb.length=0,!0}function p(){function a(a){b&&b.state_===kb&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),gb.push(this)}}}function q(a,b,c){var d=gb.pop()||p();return d.open(a),d.observe(b,c),d}function r(){function a(b){if(f(b)){var c=i.indexOf(b);c>=0?(i[c]=void 0,h.push(b)):h.indexOf(b)<0&&(h.push(b),Object.observe(b,d)),a(Object.getPrototypeOf(b))}}function b(){if(k=!1,j){var b=i===hb?[]:i;i=h,h=b;var c;for(var f in e)c=e[f],c&&c.state_==kb&&c.iterateObjects_(a);for(var g=0;g<i.length;g++){var l=i[g];l&&Object.unobserve(l,d)}i.length=0}}function c(){k||(j=!0,k=!0,fb(b))}function d(){var a;for(var b in e)a=e[b],a&&a.state_==kb&&a.check_();c()}var e=[],g=0,h=[],i=hb,j=!1,k=!1,l={object:void 0,objects:h,open:function(b){e[b.id_]=b,g++,b.iterateObjects_(a)},close:function(a){if(e[a.id_]=void 0,g--,g)return void c();j=!1;for(var b=0;b<h.length;b++)Object.unobserve(h[b],d),t.unobservedCount++;e.length=0,h.length=0,ib.push(this)},reset:c};return l}function s(a,b){return cb&&cb.object===b||(cb=ib.pop()||r(),cb.object=b),cb.open(a),cb}function t(){this.state_=jb,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nb++}function u(a){t._allObserversCount++,pb&&ob.push(a)}function v(){t._allObserversCount--}function w(a){t.call(this),this.value_=a,this.oldObject_=void 0}function x(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");w.call(this,a)}function y(a,b){t.call(this),this.object_=a,this.path_=b instanceof i?b:j(b),this.directObserver_=void 0}function z(){t.call(this),this.value_=[],this.directObserver_=void 0,this.observed_=[]}function A(a){return a}function B(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||A,this.setValueFn_=c||A,this.dontPassThroughSet_=d}function C(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function D(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];tb[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=M&&(g.type!=L?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function E(a,b,c){return{index:a,removed:b,addedCount:c}}function F(){}function G(a,b,c,d,e,f){return yb.calcSplices(a,b,c,d,e,f)}function H(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function I(a,b,c,d){for(var e=E(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=H(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function J(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case P:I(c,g.index,g.removed.slice(),g.addedCount);break;case L:case M:case O:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;I(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function K(a,b){var c=[];return J(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(G(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var L="add",M="update",N="reconfigure",O="delete",P="splice",Q=b(),R=c(),S=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},T="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},U="[$_a-zA-Z]",V="[$_a-zA-Z0-9]",W=U+"+"+V+"*",X="(?:[0-9]|[1-9]+[0-9]+)",Y="(?:"+W+"|"+X+")",Z="(?:"+Y+")(?:\\s*\\.\\s*"+Y+")*",$=new RegExp("^"+Z+"$"),_={},ab={};i.get=j,i.prototype=T({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!a)return;b(a)}},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++){{this[e]}c+=a[e],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[e],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var bb=new i("",_);bb.valid=!1,bb.getValueFrom=bb.setValueFrom=function(){};var cb,db=1e3,eb=[],fb=Q?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){o(),b=!1}),function(c){eb.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eb.push(a)}}(),gb=[],hb=[],ib=[],jb=0,kb=1,lb=2,mb=3,nb=1;t.prototype={open:function(a,b){if(this.state_!=jb)throw Error("Observer has already been opened.");return u(this),this.callback_=a,this.target_=b,this.state_=kb,this.connect_(),this.value_},close:function(){this.state_==kb&&(v(this),this.state_=lb,this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0)},deliver:function(){this.state_==kb&&k(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){t._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var ob,pb=!Q;t._allObserversCount=0,pb&&(ob=[]);var qb=!1,rb="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!qb){if(rb)return void Object.deliverAllChangeRecords();if(pb){qb=!0;var b,c,d=0;do{d++,c=ob,ob=[],b=!1;for(var e=0;e<c.length;e++){var f=c[e];f.state_==kb&&(f.check_()&&(b=!0),ob.push(f))}o()&&(b=!0)}while(db>d&&b);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=d),qb=!1}}},pb&&(a.Platform.clearObservers=function(){ob=[]}),w.prototype=T({__proto__:t.prototype,arrayObserve:!1,connect_:function(){Q?this.directObserver_=q(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(Q){if(!a)return!1;c={},b=D(this.value_,a,c)}else c=this.oldObject_,b=n(this.value_,this.oldObject_);return m(b)?!1:(Q||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){Q?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==kb&&(Q?this.directObserver_.deliver(!1):k(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),x.prototype=T({__proto__:w.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(Q){if(!a)return!1;b=K(this.value_,a)}else b=G(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(Q||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),x.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},y.prototype=T({__proto__:t.prototype,connect_:function(){Q&&(this.directObserver_=s(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||g(this.value_,c)?!1:(this.report_([this.value_,c]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var sb={};z.prototype=T({__proto__:t.prototype,connect_:function(){if(this.check_(void 0,!0),Q){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==sb){b=!0;break}return this.directObserver_?b?void this.directObserver_.reset():(this.directObserver_.close(),void(this.directObserver_=void 0)):void(b&&(this.directObserver_=s(this,a)))}},closeObservers_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===sb&&this.observed_[a+1].close();this.observed_.length=0},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0),this.closeObservers_()},addPath:function(a,b){if(this.state_!=jb&&this.state_!=mb)throw Error("Cannot add paths once started.");this.observed_.push(a,b instanceof i?b:j(b))},addObserver:function(a){if(this.state_!=jb&&this.state_!=mb)throw Error("Cannot add observers once started.");a.open(this.deliver,this),this.observed_.push(sb,a)},startReset:function(){if(this.state_!=kb)throw Error("Can only reset while open");this.state_=mb,this.closeObservers_()},finishReset:function(){if(this.state_!=mb)throw Error("Can only finishReset after startReset");return this.state_=kb,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==sb&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e=this.observed_[d+1],f=this.observed_[d],h=f===sb?e.discardChanges():e.getValueFrom(f);b?this.value_[d/2]=h:g(h,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=h)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),B.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!g(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var tb={};tb[L]=!0,tb[M]=!0,tb[O]=!0,t.defineComputedProperty=function(a,b,c){var d=C(a,b),e=c.open(function(a,b){e=a,d&&d(M,b)});return Object.defineProperty(a,b,{get:function(){return c.deliver(),e},set:function(a){return c.setValue(a),a},configurable:!0}),{close:function(){c.close(),Object.defineProperty(a,b,{value:e,writable:!0,configurable:!0})}}};var ub=0,vb=1,wb=2,xb=3;F.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(ub):(e.push(vb),d=g),b--,c--):f==h?(e.push(xb),b--,d=h):(e.push(wb),c--,d=i)}else e.push(xb),b--;else e.push(wb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=E(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[E(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case ub:j&&(l.push(j),j=void 0),m++,n++;break;case vb:j||(j=E(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case wb:j||(j=E(m,[],0)),j.addedCount++,m++;break;case xb:j||(j=E(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var yb=new F;a.Observer=t,a.Observer.runEOM_=fb,a.Observer.hasObjectObserve=Q,a.ArrayObserver=x,a.ArrayObserver.calculateSplices=function(a,b){return yb.calculateSplices(a,b)},a.ArraySplice=F,a.ObjectObserver=w,a.PathObserver=y,a.CompoundObserver=z,a.Path=i,a.ObserverTransform=B,a.Observer.changeRecordTypes={add:L,update:M,reconfigure:N,"delete":O,splice:P}}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return L(b).forEach(function(c){K(a,c,M(b,c))}),a}function d(a,b){return L(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}K(a,c,M(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=E.get(b);if(c)return c;var d=f(b),e=t(d);return q(b,e,a),e}function g(a,b){o(a,b,!0)}function h(a,b){o(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return H&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return H&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return H&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return O}}function o(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){N&&b.__lookupGetter__(g);var h,j,o=n(b,g);if(d&&"function"==typeof o.value)c[g]=m(g);else{var p=i(g);h=p?a.getEventHandlerGetter(g):k(g),(o.writable||o.set)&&(j=p?a.getEventHandlerSetter(g):l(g)),K(c,g,{get:h,set:j,configurable:o.configurable,enumerable:o.enumerable})}}}}function p(a,b,c){var e=a.prototype;q(e,b,c),d(b,a)}function q(a,c,d){var e=c.prototype;b(void 0===E.get(a)),E.set(a,c),F.set(e,a),g(a,e),d&&h(e,d),K(e,"constructor",{value:c,configurable:!0,enumerable:!1,writable:!0})}function r(a,b){return E.get(b.prototype)===a}function s(a){var b=Object.getPrototypeOf(a),c=f(b),d=t(c);return q(b,d,a),d}function t(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function u(a){return a instanceof G.EventTarget||a instanceof G.Event||a instanceof G.Range||a instanceof G.DOMImplementation||a instanceof G.CanvasRenderingContext2D||G.WebGLRenderingContext&&a instanceof G.WebGLRenderingContext}function v(a){return Q&&a instanceof Q||a instanceof S||a instanceof R||a instanceof T||a instanceof U||a instanceof P||a instanceof V||W&&a instanceof W||X&&a instanceof X}function w(a){return null===a?null:(b(v(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function x(a){return null===a?null:(b(u(a)),a.impl)}function y(a){return a&&u(a)?x(a):a}function z(a){return a&&!u(a)?w(a):a}function A(a,c){null!==c&&(b(v(a)),b(void 0===c||u(c)),a.polymerWrapper_=c)}function B(a,b,c){K(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function C(a,b){B(a,b,function(){return w(this.impl[b])})}function D(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=z(this);return a[b].apply(a,arguments)}})})}var E=new WeakMap,F=new WeakMap,G=Object.create(null),H=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(H)try{var I=new Function("","return true;");H=I()}catch(J){H=!1}var K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor;L(window);var N=/Firefox/.test(navigator.userAgent),O={get:function(){},set:function(){},configurable:!0,enumerable:!0},P=window.DOMImplementation,Q=window.EventTarget,R=window.Event,S=window.Node,T=window.Window,U=window.Range,V=window.CanvasRenderingContext2D,W=window.WebGLRenderingContext,X=window.SVGElementInstance;a.assert=b,a.constructorTable=E,a.defineGetter=B,a.defineWrapGetter=C,a.forwardMethodsToWrapper=D,a.isWrapper=u,a.isWrapperFor=r,a.mixin=c,a.nativePrototypeTable=F,a.oneOf=e,a.registerObject=s,a.registerWrapper=p,a.rewrap=A,a.unwrap=x,a.unwrapIfNeeded=y,a.wrap=w,a.wrapIfNeeded=z,a.wrappers=G}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&P(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var l=null;if(g.length){if(c(i)&&(l=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(m(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,l,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(a,b){return a===b?!0:a instanceof Q.ShadowRoot?n(l(a.host),b):!1}function o(a){return S.get(a)?void 0:(S.set(a,!0),p(P(a),P(a.target)))}function p(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var d=g(c);return"load"===b.type&&2===d.length&&d[0].target instanceof Q.Document&&d.shift(),_.set(b,d),q(b,d)&&r(b,d)&&s(b,d),X.set(b,v.NONE),V.delete(b,null),T.delete(b),b.defaultPrevented}function q(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=v.CAPTURING_PHASE,!t(b[d],a,c)))return!1}return!0}function r(a,b){var c=v.AT_TARGET;return t(b[0],a,c)}function s(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=v.AT_TARGET;else{if(!d||Z.get(a))continue;c=v.BUBBLING_PHASE}if(!t(b[e],a,c))return}}function t(a,b,c){var d=a.target,e=a.currentTarget,f=R.get(e);if(!f)return!0;if("relatedTarget"in b){var g=O(b);if(g.relatedTarget){var h=P(g.relatedTarget),j=i(e,h);if(j===d)return!0;W.set(b,j)}}X.set(b,c);var k=b.type,l=!1;U.set(b,d),V.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===v.CAPTURING_PHASE||n.capture&&c===v.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),Z.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!Y.get(b)}function u(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function v(a,b){return a instanceof ab?void(this.impl=a):P(z(ab,"Event",a,b))}function w(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function x(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(z(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function y(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function z(a,b,c,d){if(jb)return new a(c,w(d));var e=O(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function A(){v.call(this)}function B(a){return"function"==typeof a?!0:a&&a.handleEvent}function C(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function D(a){this.impl=a}function E(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function F(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function G(a,b){for(var c=O(a);c;c=c.parentNode)if(F(P(c),b))return!0;return!1}function H(a){L(a,mb)}function I(b,c,d,e){a.renderAllPending();for(var f=P(nb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function J(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function K(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var L=a.forwardMethodsToWrapper,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap;u.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var ab=window.Event;ab.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},v.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=new Q.NodeList,b=_.get(this);if(b){for(var c=0,d=b.length-1,e=l(V.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof Q.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(ab,v,document.createEvent("Event"));var bb=x("UIEvent",v),cb=x("CustomEvent",v),db={get relatedTarget(){return W.get(this)||P(O(this).relatedTarget)}},eb=M({initMouseEvent:y("initMouseEvent",14)},db),fb=M({initFocusEvent:y("initFocusEvent",5)},db),gb=x("MouseEvent",bb,eb),hb=x("FocusEvent",bb,fb),ib=Object.create(null),jb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=M(M({},d),b)}ib[a]=b};
-kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}A.prototype=Object.create(v.prototype),M(A.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}});var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(B(b)&&!C(a)){var d=new u(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],R.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,o,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=E(this);h.removeEventListener_(a,o,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;G(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},lb&&N(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=I,a.getEventHandlerGetter=J,a.getEventHandlerSetter=K,a.wrapEventTargetMethods=H,a.wrappers.BeforeUnloadEvent=A,a.wrappers.CustomEvent=cb,a.wrappers.Event=v,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=hb,a.wrappers.MouseEvent=gb,a.wrappers.UIEvent=bb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){y(a instanceof v)}function c(a){var b=new x;return b[0]=a,b.length=1,b}function d(a,b,c){A(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){A(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);J=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;J=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new x,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a){a.nodeIsInserted_()}function k(a){for(var b=0;b<a.length;b++)j(a[b])}function l(){}function m(){}function n(a,b){var c=a.nodeType===v.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return F(b[0]);for(var d=F(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(F(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){y(b.parentNode===a);var c=b.nextSibling,d=F(b),e=d.parentNode;e&&Q.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=F(a),g=f.firstChild;g;)c=g.nextSibling,Q.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=G(c?K.call(c,a.impl,!1):L.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof I.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a){y(a instanceof M),w.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var w=a.wrappers.EventTarget,x=a.wrappers.NodeList,y=a.assert,z=a.defineWrapGetter,A=a.enqueueMutation,B=a.isWrapper,C=a.mixin,D=a.registerTransientObservers,E=a.registerWrapper,F=a.unwrap,G=a.wrap,H=a.wrapIfNeeded,I=a.wrappers,J=!1,K=document.importNode,L=window.Node.prototype.cloneNode,M=window.Node,N=window.DocumentFragment,O=(M.prototype.appendChild,M.prototype.compareDocumentPosition),P=M.prototype.insertBefore,Q=M.prototype.removeChild,R=M.prototype.replaceChild,S=/Trident/.test(navigator.userAgent),T=S?function(a,b){try{Q.call(a,b)}catch(c){if(!(a instanceof N))throw c}}:function(a,b){Q.call(a,b)};v.prototype=Object.create(w.prototype),C(v.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?B(c)?d=F(c):(d=c,c=G(d)):(c=null,d=null),c&&y(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),P.call(this.impl,F(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1]);var j=d?d.parentNode:this.impl;j?P.call(j,p(this,e),d):o(this,e)}return A(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=F(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&T(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),T(this.impl,f);return J||A(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),D(this,a),a},replaceChild:function(a,d){b(a);var e;if(B(d)?e=F(d):(e=d,d=G(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),R.call(this.impl,F(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&R.call(e.parentNode,p(this,h),e)),A(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:G(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:G(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:G(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:G(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:G(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==v.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=v.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);A(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d)},get childNodes(){for(var a=new x,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){if(!a)return!1;if(a=H(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return O.call(this.impl,F(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===v.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,cleanUpNodes(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),z(v,"ownerDocument"),E(M,v,document.createDocumentFragment()),delete v.prototype.querySelector,delete v.prototype.querySelectorAll,v.prototype=C(Object.create(w.prototype),v.prototype),a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=v,a.cloneNode=u}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.wrappers,o=window.Element,p=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return o.prototype[a]}),q=p[0],r=o.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new n.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return r.call(this.impl,a)}}),p.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),o.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),m(o,d,document.createElementNS(null,"x")),a.matchesNames=p,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){"object"==typeof a&&(a=f(a)),f(this).remove(a)},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.registerObject,c="http://www.w3.org/2000/svg",d=document.createElementNS(c,"title"),e=b(d),f=Object.getPrototypeOf(e.prototype).constructor;a.wrappers.SVGElement=f}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new WeakMap,k=new WeakMap,l=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},get host(){return j.get(this)||null},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return l.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=F(a),g=F(c),h=e?F(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=G(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=F(a),d=c.parentNode;if(d){var e=G(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=I.get(a);c||I.set(a,c=[]),c.push(b)}function f(a){H.set(a,[])}function g(a){var b=H.get(a);return b||H.set(a,b=[]),b}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if("*"===c||c===a.localName)return!0;if(!L.test(c))return!1;if(":"===c[0]&&!M.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<O.length;a++)O[a].render();O=[]}function l(){y=null,k()}function m(a){var b=K.get(a);return b||(b=new q(a),K.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof D)return a;return null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof A}function s(a){return a instanceof A}function t(a){return a instanceof B}function u(a){return a instanceof B}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){J.set(a,b)}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.mixin,a.oneOf),F=a.unwrap,G=a.wrap,H=new WeakMap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=/^[*.:#[a-zA-Z_|]/,M=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),N=E(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),O=[],P=new ArraySplice;
-P.equals=function(a,b){return F(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(F(b)),g=a||new WeakMap,i=P.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=G(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&G(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,O.push(this),y)return;y=window[N](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);e.invalidate(),e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=function(){return k(),g(this)},B.prototype.nodeIsInserted_=A.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=I,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=J,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return z(c.apply(this.impl,arguments))}}function d(a,b){C.call(b.impl,y(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return z(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.cloneNode,q=a.defineWrapGetter,r=a.elementFromPoint,s=a.forwardMethodsToWrapper,t=a.matchesNames,u=a.mixin,v=a.registerWrapper,w=a.renderAllPending,x=a.rewrap,y=a.unwrap,z=a.wrap,A=a.wrapEventTargetMethods,B=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),q(b,"documentElement"),q(b,"body"),q(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var C=document.adoptNode,D=document.getSelection;if(u(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return r(this,this,a,b)},importNode:function(a,b){return p(a,b,this.impl)},getSelection:function(){return w(),new m(D.call(y(this)))}}),document.registerElement){var E=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):c.extends?document.createElement(c.extends,b):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){z(this)instanceof d||x(this),b.apply(z(this),arguments)})});var k={prototype:i};c.extends&&(k.extends=c.extends),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i);E.call(y(this),b,k);return d},s([window.HTMLDocument||window.Document],["registerElement"])}s([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(t)),s([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getSelection"]),u(b.prototype,j),u(b.prototype,l),u(b.prototype,n),u(b.prototype,{get implementation(){var a=B.get(this);return a?a:(a=new g(y(this).implementation),B.set(this,a),a)}}),v(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&v(window.HTMLDocument,b),A([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),v(window.DOMImplementation,g),s([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))}}),f(k,b),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(){window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot}(),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){s.initialized=!0,document.body.appendChild(s);var a=s.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){s.initialized||e(),document.body.appendChild(s),a(s.contentDocument),document.body.removeChild(s)}function g(a,b){if(b){var e;if(a.match("@import")&&u){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(w,""),document.head.appendChild(d)}function j(){return t||(t=document.createElement("style"),t.setAttribute(w,""),t[w]=!0),t}var k={strictStyling:!1,registry:{},shimStyling:function(a,b,d,e){var f=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b);var j=this.stylesToShimmedCssText(g.rootStyles,g.scopeStyles,b,f);g.shimmedStyle=c(j),a&&(a.shimmedStyle=g.shimmedStyle);for(var k,l=0,m=g.rootStyles.length;m>l&&(k=g.rootStyles[l]);l++)k.parentNode.removeChild(k);e?i(j,b):h(j)},stylesToShimmedCssText:function(a,b,c,d){c=c||"",this.insertPolyfillDirectives(a),this.insertPolyfillRules(a);var e=this.shimScoping(b,c,d);return e+=this.extractPolyfillUnscopedRules(a),e.trim()},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?a.querySelectorAll("style"):[];e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return!f||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(m,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(n,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=o.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},shimScoping:function(a,b,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,d){var e=b(a);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonAncestor(e),e=this.convertCombinators(e),c){var e,f=this;g(e,function(a){e=f.scopeRules(a,c,d)})}return e},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonAncestor:function(a){return this.convertColonRule(a,cssColonAncestorRe,this.colonAncestorPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonAncestorPartReplacer:function(a,b,c){return b.match(p)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(p,"")+c},convertCombinators:function(a){return a.replace(/\^\^/g," ").replace(/\^/g," ")},scopeRules:function(a,b,c){var d="";return a&&Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n	",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.type===CSSRule.MEDIA_RULE?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b,c),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")},selectorNeedsScoping:function(a,b,c){var d=this.makeScopeMatcher(b,c);return!a.match(d)},makeScopeMatcher:function(a,b){var c=b?"\\[is=['\"]?"+a+"['\"]?\\]":a;return new RegExp("^("+c+")"+selectorReSuffix,"m")},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,d),a.replace(polyfillHostRe,d+" ")):d+" "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(hostRe,p).replace(colonHostRe,p).replace(colonAncestorRe,q)},propertiesFromRule:function(a){return a.style.content&&!a.style.content.match(/['"]+/)?a.style.cssText.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"):a.style.cssText}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,o=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p="-shadowcsshost",q="-shadowcssancestor",r=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+p+r,"gim"),cssColonAncestorRe=new RegExp("("+q+r,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",hostRe=/@host/gim,colonHostRe=/\:host/gim,colonAncestorRe=/\:ancestor/gim,polyfillHostNoCombinator=p+"-no-combinator",polyfillHostRe=new RegExp(p,"gim"),polyfillAncestorRe=new RegExp(q,"gim");var s=document.createElement("iframe");s.style.display="none";var t,u=navigator.userAgent.match("Chrome"),v="shim-shadowdom",w="shim-shadowdom-css";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var x=wrap(document),y=x.querySelector("head");y.insertBefore(j(),y.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+v+"]",d="style["+v+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[w]){var c=a.__importElement||a;if(!c.hasAttribute(v))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c);var d=[c];c.textContent=k.stylesToShimmedCssText(d,d),c.removeAttribute(v,""),c.setAttribute(w,""),c[w]=!0,c.parentNode!==y&&(a.parentNode===y?y.replaceChild(c,a):y.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a)}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(v)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.templateContent=window.templateContent||function(a){return a.content},window.wrap=window.unwrap=function(a){return a};var a=Element.prototype.webkitCreateShadowRoot;Element.prototype.webkitCreateShadowRoot=function(){var b=this.webkitShadowRoot,c=a.call(this);return c.olderShadowRoot=b,c.host=this,CustomElements.watchShadow(this),c},Object.defineProperties(Element.prototype,{shadowRoot:{get:function(){return this.webkitShadowRoot}},createShadowRoot:{value:function(){return this.webkitCreateShadowRoot()}}}),window.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),window.templateContent=window.templateContent||function(a){return a.content},function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f
-},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.module=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d){return a.replace(d,function(a,d,e,f){var g=e.replace(/["']/g,"");return g=c(b,g),d+"'"+g+"'"+f})}function c(a,b){var c=new URL(b,a);return d(c.href)}function d(a){var b=document.baseURI,c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b.pathname,c.pathname):a}function e(a,b){for(var c=a.split("/"),d=b.split("/");c.length&&c[0]===d[0];)c.shift(),d.shift();for(var e=0,f=c.length-1;f>e;e++)d.unshift("..");return d.join("/")}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c){return a=b(a,c,g),b(a,c,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,b){b=b||a.ownerDocument.baseURI,i.forEach(function(d){var e=a.attributes[d];if(e&&e.value&&e.value.search(k)<0){var f=c(b,e.value);e.value=f}})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){c.load&&console.log("fetch",a,d);var e=function(b,c){this.receive(a,d,b,c)}.bind(this);b.load(a,e)},receive:function(a,b,c,d){this.cache[a]=d;for(var e,f=this.pending[a],g=0,h=f.length;h>g&&(e=f[g]);g++)this.onload(a,e,d),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){4===f.readyState&&d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a),this.parseNext()},parseImport:function(a){if(a.import.__importParsed=!0,HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.markParsingComplete(a)},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a)};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,m)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(m)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||n,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===u}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===u)&&(b.removeEventListener(v,c),g(a,b))};b.addEventListener(v,c)}}function h(a,b){function c(){f==g&&requestAnimationFrame(a)}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return k?a.import&&"loading"!==a.import.readyState:a.__importParsed}var j="import"in document.createElement("link"),k=j,l=a.flags,m="import",n=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(k)var o={};else var p=(a.xhr,a.Loader),q=a.parser,o={documents:{},documentPreloadSelectors:"link[rel="+m+"]",importsPreloadSelectors:["link[rel="+m+"]"].join(","),loadNode:function(a){r.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);r.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===n?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(l.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}q.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),q.parseNext()},loadedAll:function(){q.parseNext()}},r=new p(o.loaded.bind(o),o.loadedAll.bind(o));var s={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",s),Object.defineProperty(n,"_currentScript",s),!document.baseURI){var t={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",t),Object.defineProperty(n,"baseURI",t)}var u=HTMLImports.isIE?"complete":"interactive",v="readystatechange";a.hasNative=j,a.useNative=k,a.importer=o,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=m,a.isImportLoaded=i,a.importLoader=r}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e=0,g=a.length;g>e&&(b=a[e]);e++)d(b)&&f.loadNode(b),b.children&&b.children.length&&c(b.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,f){var g=f||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(m(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!g.prototype)throw new Error("Options missing required prototype property");return g.__name=b.toLowerCase(),g.lifecycle=g.lifecycle||{},g.ancestry=c(g.extends),d(g),e(g),k(g.prototype),n(g.__name,g),g.ctor=o(g),g.ctor.prototype=g.prototype,g.prototype.constructor=g.ctor,a.ready&&a.upgradeDocumentTree(document),g.ctor}function c(a){var b=m(a);return b?c(b.extends).concat([b]):[]}function d(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function e(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag);b=Object.getPrototypeOf(c)}for(var d,e=a.prototype;e&&e!==b;){var d=Object.getPrototypeOf(e);e.__proto__=d,e=d}}a.native=b}function f(a){return g(z(a.tag),a)}function g(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),h(b,c),b.__upgraded__=!0,j(b),a.insertedNode(b),a.upgradeSubtree(b),b}function h(a,b){Object.__proto__?a.__proto__=b.prototype:(i(a,b.prototype,b.native),a.__proto__=b.prototype)}function i(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function j(a){a.createdCallback&&a.createdCallback()}function k(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){l.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){l.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function l(a,b,c){var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function m(a){return a?x[a.toLowerCase()]:void 0}function n(a,b){x[a]=b}function o(a){return function(){return f(a)}}function p(a,b,c){return a===y?q(b,c):A(a,b)}function q(a,b){var c=m(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=q(a);return d.setAttribute("is",b),d}var d=z(a);return a.indexOf("-")>=0&&h(d,HTMLElement),d}function r(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=m(b||a.localName);if(c){if(b&&c.tag==a.localName)return g(a,c);if(!b&&!c.extends)return g(a,c)}}}function s(b){var c=B.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var t=a.flags,u=Boolean(document.registerElement),v=!t.register&&u&&!window.ShadowDOMPolyfill;if(v){var w=function(){};a.registry={},a.upgradeElement=w,a.watchShadow=w,a.upgrade=w,a.upgradeAll=w,a.upgradeSubtree=w,a.observeDocument=w,a.upgradeDocument=w,a.upgradeDocumentTree=w,a.takeRecords=w}else{var x={},y="http://www.w3.org/1999/xhtml",z=document.createElement.bind(document),A=document.createElementNS.bind(document),B=Node.prototype.cloneNode;document.registerElement=b,document.createElement=q,document.createElementNS=p,Node.prototype.cloneNode=s,a.registry=x,a.upgrade=r}var C;C=Object.__proto__||v?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=C,document.register=document.registerElement,a.hasNative=u,a.useNative=v}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b);this.fetch(d,{},c)},fetch:function(a,b,d){var e=a.length;if(!e)return d(b);for(var f,g,h,i=function(){0===--e&&d(b)},j=function(a,c){var d=c.match,e=d.url;if(a)return b[e]="",i();var f=c.response||c.responseText;b[e]=f,this.fetch(this.extractUrls(f,e),b,i)},k=0;e>k;k++)f=a[k],h=f.url,b[h]?c(i):(g=this.xhr(h,j,this),g.match=f,b[h]=g)},xhr:function(a,b,c){var d=new XMLHttpRequest;return d.open("GET",a,!0),d.send(),d.onload=function(){b.call(c,null,d)},d.onerror=function(){b.call(c,null,d)},d}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b){var c=a.textContent,d=a.ownerDocument.baseURI,e=function(c){a.textContent=c,b(a)};this.resolve(c,d,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f),g=this.flatten(g,f,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b){function c(){e++,e===f&&b&&b()}for(var d,e=0,f=a.length,g=0;f>g&&(d=a[g]);g++)this.resolveNode(d,c)}};var e=new b;a.styleResolver=e}(window.Platform),function(a){a=a||{},a.external=a.external||{};var b={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d}e=this.olderShadow(e)}return f}},owner:function(a){for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),window.PointerEventsPolyfill=a}(window.PointerEventsPolyfill),function(){function a(a){return"body ^^ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; touch-action-delay: none; }"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],e="";d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",e+=a(d)+c(d)+"\n"):(e+=d.selectors.map(b)+c(d.rule)+"\n",e+=d.selectors.map(a)+c(d.rule)+"\n")});var f=document.createElement("style");f.textContent=e,document.head.appendChild(f)}(),function(a){function b(a,e){e=e||{};var f;if(e.buttons||d)f=e.buttons;else switch(e.which){case 1:f=1;break;case 2:f=4;break;case 3:f=2;break;default:f=0}var i;if(c)i=new MouseEvent(a,e);else{i=document.createEvent("MouseEvent");for(var j,k={},l=0;l<g.length;l++)j=g[l],k[j]=e[j]||h[l];i.initMouseEvent(a,k.bubbles,k.cancelable,k.view,k.detail,k.screenX,k.screenY,k.clientX,k.clientY,k.ctrlKey,k.altKey,k.shiftKey,k.metaKey,k.button,k.relatedTarget)}i.__proto__=b.prototype,d||Object.defineProperty(i,"buttons",{get:function(){return f},enumerable:!0});var m=0;return m=e.pressure?e.pressure:f?.5:0,Object.defineProperties(i,{pointerId:{value:e.pointerId||0,enumerable:!0},width:{value:e.width||0,enumerable:!0},height:{value:e.height||0,enumerable:!0},pressure:{value:m,enumerable:!0},tiltX:{value:e.tiltX||0,enumerable:!0},tiltY:{value:e.tiltY||0,enumerable:!0},pointerType:{value:e.pointerType||"",enumerable:!0},hwTimestamp:{value:e.hwTimestamp||0,enumerable:!0},isPrimary:{value:e.isPrimary||!1,enumerable:!0}}),i}var c=!1,d=!1;try{var e=new MouseEvent("click",{buttons:1});c=!0,d=1===e.buttons}catch(f){}var g=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget"],h=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null];b.prototype=Object.create(MouseEvent.prototype),a.PointerEvent||(a.PointerEvent=b)}(window),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PointerEventsPolyfill),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0],d="undefined"!=typeof SVGElementInstance,e={targets:new WeakMap,handledEvents:new WeakMap,pointermap:new a.PointerMap,eventMap:{},eventSources:{},eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;
-d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},contains:a.external.contains||function(a,b){return a.contains(b)},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.contains(a.target,a.relatedTarget)||this.leave(a)},enterOver:function(a){this.over(a),this.contains(a.target,a.relatedTarget)||this.enter(a)},eventHandler:function(a){if(!this.handledEvents.get(a)){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),this.handledEvents.set(a,!0)}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:a.external.addEvent||function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:a.external.removeEvent||function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){this.captureInfo&&(b.relatedTarget=null);var c=new PointerEvent(a,b);return b.preventDefault&&(c.preventDefault=b.preventDefault),this.targets.set(c,this.targets.get(b)||b.target),c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f={},g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],!d||"target"!==e&&"relatedTarget"!==e||f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return a.preventDefault&&(f.preventDefault=function(){a.preventDefault()}),f},getTarget:function(a){return this.captureInfo&&this.captureInfo.id===a.pointerId?this.captureInfo.target:this.targets.get(a)},setCapture:function(a,b){this.captureInfo&&this.releaseCapture(this.captureInfo.id),this.captureInfo={id:a,target:b};var c=new PointerEvent("gotpointercapture",{bubbles:!0});this.implicitRelease=this.releaseCapture.bind(this,a),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease),this.targets.set(c,b),this.asyncDispatchEvent(c)},releaseCapture:function(a){if(this.captureInfo&&this.captureInfo.id===a){var b=new PointerEvent("lostpointercapture",{bubbles:!0}),c=this.captureInfo.target;this.captureInfo=null,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease),this.targets.set(b,c),this.asyncDispatchEvent(b)}},dispatchEvent:a.external.dispatchEvent||function(a){var b=this.getTarget(a);return b?b.dispatchEvent(a):void 0},asyncDispatchEvent:function(a){setTimeout(this.dispatchEvent.bind(this,a),0)}};e.boundHandler=e.eventHandler.bind(e),a.dispatcher=e,a.register=e.register.bind(e),a.unregister=e.unregister.bind(e)}(window.PointerEventsPolyfill),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("DOMContentLoaded",this.installNewSubtree.bind(this,document))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a),d=c.preventDefault;return c.preventDefault=function(){a.preventDefault(),d()},c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.has(this.POINTER_ID);d&&this.cancel(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,a),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.move(c)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d&&d.button===a.button){var e=this.prepareEvent(a);b.up(e),this.cleanupMouse()}}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.enterOver(c)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.leaveOut(c)}},cancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanupMouse()},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=e}(window.PointerEventsPolyfill),function(a){var b,c=a.dispatcher,d=a.findTarget,e=a.targetFinding.allShadows.bind(a.targetFinding),f=c.pointermap,g=Array.prototype.map.call.bind(Array.prototype.map),h=2500,i=200,j="touch-action",k=!1,l={scrollType:new WeakMap,events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){k?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){k&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(j),d=this.touchActionToScrollType(b);d&&(this.scrollType.set(a,d),c.listen(a,this.events),e(a).forEach(function(a){this.scrollType.set(a,d),c.listen(a,this.events)},this))},elementRemoved:function(a){this.scrollType["delete"](a),c.unlisten(a,this.events),e(a).forEach(function(a){this.scrollType["delete"](a),c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(j),d=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);d&&f?(this.scrollType.set(a,d),e(a).forEach(function(a){this.scrollType.set(a,d)},this)):f?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===f.pointers()||1===f.pointers()&&f.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,i)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},touchToPointer:function(a){var b=c.cloneEvent(a);return b.pointerId=a.identifier+2,b.target=d(b),b.bubbles=!0,b.cancelable=!0,b.detail=this.clickCount,b.button=0,b.buttons=1,b.width=a.webkitRadiusX||a.radiusX||0,b.height=a.webkitRadiusY||a.radiusY||0,b.pressure=a.webkitForce||a.force||.5,b.isPrimary=this.isPrimaryTouch(a),b.pointerType=this.POINTER_TYPE,b},processTouches:function(a,b){var c=a.changedTouches,d=g(c,this.touchToPointer,this);d.forEach(function(b){b.preventDefault=function(){this.scrolling=!1,this.firstXY=null,a.preventDefault()}},this),d.forEach(b,this)},shouldScroll:function(a){if(this.firstXY){var b,c=this.scrollType.get(a.currentTarget);if("none"===c)b=!1;else if("XY"===c)b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(f.pointers()>=b.length){var c=[];f.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(this.touchToPointer(e))}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){f.set(a.pointerId,{target:a.target,out:a,outTarget:a.target});c.over(a),c.enter(a),c.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,d=f.get(b.pointerId);if(d){var e=d.out,g=d.outTarget;c.move(b),e&&g!==b.target&&(e.relatedTarget=b.target,b.relatedTarget=g,e.target=g,b.target?(c.leaveOut(e),c.enterOver(b)):(b.target=g,b.relatedTarget=null,this.cancelOut(b))),d.out=b,d.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(c.up(a),c.out(a),c.leave(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){c.cancel(a),c.out(a),c.leave(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){f["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var f=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(f,h)}}};k||(b=new a.Installer(l.elementAdded,l.elementRemoved,l.elementChanged,l)),a.touchEvents=l}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return d&&(c=b.cloneEvent(a),c.pointerType=this.POINTER_TYPES[a.pointerType]),c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(a){c.set(a.pointerId,a);var d=this.prepareEvent(a);b.down(d)},MSPointerMove:function(a){var c=this.prepareEvent(a);b.move(c)},MSPointerUp:function(a){var c=this.prepareEvent(a);b.up(c),this.cleanup(a.pointerId)},MSPointerOut:function(a){var c=this.prepareEvent(a);b.leaveOut(c)},MSPointerOver:function(a){var c=this.prepareEvent(a);b.enterOver(c)},MSPointerCancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var c=b.makeEvent("lostpointercapture",a);b.dispatchEvent(c)},MSGotPointerCapture:function(a){var c=b.makeEvent("gotpointercapture",a);b.dispatchEvent(c)}};a.msEvents=e}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher;if(void 0===window.navigator.pointerEnabled){if(Object.defineProperty(window.navigator,"pointerEnabled",{value:!0,enumerable:!0}),window.navigator.msPointerEnabled){var c=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:c,enumerable:!0}),b.registerSource("ms",a.msEvents)}else b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents);b.register(document)}}(window.PointerEventsPolyfill),function(a){function b(a){if(!e.pointermap.has(a))throw new Error("InvalidPointerId")}var c,d,e=a.dispatcher,f=window.navigator;f.msPointerEnabled?(c=function(a){b(a),this.msSetPointerCapture(a)},d=function(a){b(a),this.msReleasePointerCapture(a)}):(c=function(a){b(a),e.setCapture(a,this)},d=function(a){b(a),e.releaseCapture(a,this)}),window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:c},releasePointerCapture:{value:d}})}(window.PointerEventsPolyfill),PointerGestureEvent.prototype.preventTap=function(){this.tapPrevented=!0},function(a){a=a||{},a.utils={LCA:{find:function(a,b){if(a===b)return a;if(a.contains){if(a.contains(b))return a;if(b.contains(a))return b}var c=this.depth(a),d=this.depth(b),e=c-d;for(e>0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=this.walk(a,1),b=this.walk(b,1);return a},walk:function(a,b){for(var c=0;b>c;c++)a=a.parentNode;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode;return b}}},a.findLCA=function(b,c){return a.utils.LCA.find(b,c)},window.PointerGestures=a}(window.PointerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PointerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","screenX","screenY","pageX","pageY","tapPrevented"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],d={handledEvents:new WeakMap,targets:new WeakMap,handlers:{},recognizers:{},events:{},registerRecognizer:function(a,b){var c=b;this.recognizers[a]=c,c.events.forEach(function(a){if(c[a]){this.events[a]=!0;var b=c[a].bind(c);this.addHandler(a,b)}},this)},addHandler:function(a,b){var c=a;this.handlers[c]||(this.handlers[c]=[]),this.handlers[c].push(b)},registerTarget:function(a){this.listen(Object.keys(this.events),a)},unregisterTarget:function(a){this.unlisten(Object.keys(this.events),a)},eventHandler:function(a){if(!this.handledEvents.get(a)){var b=a.type,c=this.handlers[b];c&&this.makeQueue(c,a),this.handledEvents.set(a,!0)}},makeQueue:function(a,b){var c=this.cloneEvent(b);setTimeout(this.runQueue.bind(this,a,c),0)},runQueue:function(a,b){this.currentPointerId=b.pointerId;for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)c(b);this.currentPointerId=0},listen:function(a,b){a.forEach(function(a){this.addEvent(a,this.boundHandler,!1,b)},this)},unlisten:function(a){a.forEach(function(a){this.removeEvent(a,this.boundHandler,!1,inTarget)},this)},addEvent:function(a,b,c,d){d.addEventListener(a,b,c)},removeEvent:function(a,b,c,d){d.removeEventListener(a,b,c)},makeEvent:function(a,b){return new PointerGestureEvent(a,b)},cloneEvent:function(a){for(var d,e={},f=0;f<b.length;f++)d=b[f],e[d]=a[d]||c[f];return e},dispatchEvent:function(a,b){var c=b||this.targets.get(a);c&&(c.dispatchEvent(a),a.tapPrevented&&this.preventTap(this.currentPointerId))},asyncDispatchEvent:function(a,b){var c=function(){this.dispatchEvent(a,b)}.bind(this);setTimeout(c,0)},preventTap:function(a){var b=this.recognizers.tap;b&&b.preventTap(a)}};d.boundHandler=d.eventHandler.bind(d),a.dispatcher=d;var e=[],f=!1;a.register=function(b){if(f){var c=window.PointerEventsPolyfill;c&&c.register(b),a.dispatcher.registerTarget(b)}else e.push(b)},document.addEventListener("DOMContentLoaded",function(){f=!0,e.push(document),e.forEach(a.register)})}(window.PointerGestures),function(a){var b=a.dispatcher,c={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["pointerdown","pointermove","pointerup","pointercancel"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},pointerdown:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},pointerup:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},pointercancel:function(){this.cancel()},pointermove:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,c){var d={pointerType:this.heldPointer.pointerType,clientX:this.heldPointer.clientX,clientY:this.heldPointer.clientY};c&&(d.holdTime=c);var e=b.makeEvent(a,d);b.dispatchEvent(e,this.target),e.tapPrevented&&b.preventTap(this.heldPointer.pointerId)}};b.registerRecognizer("hold",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,c,d){var e=d,f=this.calcPositionDelta(e.downEvent,c),g=this.calcPositionDelta(e.lastMoveEvent,c);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h={dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,clientX:c.clientX,clientY:c.clientY,pageX:c.pageX,pageY:c.pageY,screenX:c.screenX,screenY:c.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:c.target,pointerType:c.pointerType},i=b.makeEvent(a,h);e.lastMoveEvent=c,b.dispatchEvent(i,e.downTarget)},pointerdown:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};c.set(a.pointerId,b)}},pointermove:function(a){var b=c.get(a.pointerId);if(b)if(b.tracking)this.fireTrack("track",a,b);else{var d=this.calcPositionDelta(b.downEvent,a),e=d.x*d.x+d.y*d.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}},pointerup:function(a){var b=c.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),c.delete(a.pointerId))},pointercancel:function(a){this.pointerup(a)}};b.registerRecognizer("track",d)}(window.PointerGestures),function(a){var b=a.dispatcher,c={MIN_VELOCITY:.5,MAX_QUEUE:4,moveQueue:[],target:null,pointerId:null,events:["pointerdown","pointermove","pointerup","pointercancel"],pointerdown:function(a){a.isPrimary&&!this.pointerId&&(this.pointerId=a.pointerId,this.target=a.target,this.addMove(a))},pointermove:function(a){a.pointerId===this.pointerId&&this.addMove(a)},pointerup:function(a){a.pointerId===this.pointerId&&this.fireFlick(a),this.cleanup()},pointercancel:function(){this.cleanup()},cleanup:function(){this.moveQueue=[],this.target=null,this.pointerId=null},addMove:function(a){this.moveQueue.length>=this.MAX_QUEUE&&this.moveQueue.shift(),this.moveQueue.push(a)},fireFlick:function(a){for(var c,d,e,f,g,h,i,j=a,k=this.moveQueue.length,l=0,m=0,n=0,o=0;k>o&&(i=this.moveQueue[o]);o++)c=j.timeStamp-i.timeStamp,d=j.clientX-i.clientX,e=j.clientY-i.clientY,f=d/c,g=e/c,h=Math.sqrt(f*f+g*g),h>n&&(l=f,m=g,n=h);var p=Math.abs(l)>Math.abs(m)?"x":"y",q=this.calcAngle(l,m);if(Math.abs(n)>=this.MIN_VELOCITY){var r=b.makeEvent("flick",{xVelocity:l,yVelocity:m,velocity:n,angle:q,majorAxis:p,pointerType:a.pointerType});b.dispatchEvent(r,this.target)}},calcAngle:function(a,b){return 180*Math.atan2(b,a)/Math.PI}};b.registerRecognizer("flick",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d=180/Math.PI,e={events:["pointerdown","pointermove","pointerup","pointercancel"],reference:{},pointerdown:function(b){if(c.set(b.pointerId,b),2==c.pointers()){var d=this.calcChord(),e=this.calcAngle(d);this.reference={angle:e,diameter:d.diameter,target:a.findLCA(d.a.target,d.b.target)}}},pointerup:function(a){c.delete(a.pointerId)},pointermove:function(a){c.has(a.pointerId)&&(c.set(a.pointerId,a),c.pointers()>1&&this.calcPinchRotate())},pointercancel:function(a){this.pointerup(a)},dispatchPinch:function(a,c){var d=a/this.reference.diameter,e=b.makeEvent("pinch",{scale:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},dispatchRotate:function(a,c){var d=Math.round((a-this.reference.angle)%360),e=b.makeEvent("rotate",{angle:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.dispatchPinch(b,a),c!=this.reference.angle&&this.dispatchRotate(c,a)},calcChord:function(){var a=[];c.forEach(function(b){a.push(b)});for(var b,d,e,f=0,g={},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),d=Math.abs(i.clientY-k.clientY),e=b+d,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,d=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:d},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*d)%360}};b.registerRecognizer("pinch",e)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel","keyup"],pointerdown:function(a){a.isPrimary&&!a.tapPrevented&&c.set(a.pointerId,{target:a.target,x:a.clientX,y:a.clientY})},pointermove:function(a){if(a.isPrimary){var b=c.get(a.pointerId);b&&a.tapPrevented&&c.delete(a.pointerId)}},shouldTap:function(a){return a.tapPrevented?void 0:"mouse"===a.pointerType?1===a.buttons:!0},pointerup:function(d){var e=c.get(d.pointerId);if(e&&this.shouldTap(d)){var f=a.findLCA(e.target,d.target);if(f){var g=b.makeEvent("tap",{x:d.clientX,y:d.clientY,detail:d.detail,pointerType:d.pointerType});b.dispatchEvent(g,f)}}c.delete(d.pointerId)},pointercancel:function(a){c.delete(a.pointerId)},keyup:function(a){var c=a.keyCode;if(32===c){var d=a.target;d instanceof HTMLInputElement||d instanceof HTMLTextAreaElement||b.dispatchEvent(b.makeEvent("tap",{x:0,y:0,detail:0,pointerType:"unavailable"}),d)}},preventTap:function(a){c.delete(a)}};b.registerRecognizer("tap",d)}(window.PointerGestures),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b){var c=a.bindings;if(!c)return void(a.bindings={});var d=c[b];d&&(d.close(),c[b]=void 0)}function c(a){return null==a?"":a}function d(a,b){a.data=c(b)}function e(a){return function(b){return d(a,b)}}function f(a,b,d,e){return d?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,c(e))}function g(a,b,c){return function(d){f(a,b,c,d)}}function h(a){switch(a.type){case"checkbox":return s;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function i(a,b,d,e){a[b]=(e||c)(d)}function j(a,b,c){return function(d){return i(a,b,d,c)}}function k(){}function l(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||k)(a),Platform.performMicrotaskCheckpoint()}var f=h(a);a.addEventListener(f,e);var g=c.close;c.close=function(){g&&(a.removeEventListener(f,e),c.close=g,c.close(),g=void 0)}}function m(a){return Boolean(a)}function n(b){if(b.form)return r(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return r(d,function(a){return a!=b&&!a.form})}function o(a){"INPUT"===a.tagName&&"radio"===a.type&&n(a).forEach(function(a){var b=a.bindings.checked;b&&b.setValue(!1)})}function p(a,b){var d,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings&&g.bindings.value&&(d=g,e=d.bindings.value,f=d.value),a.value=c(b),d&&d.value!=f&&(e.setValue(d.value),e.discardChanges(),Platform.performMicrotaskCheckpoint())}function q(a){return function(b){p(a,b)}}var r=Array.prototype.filter.call.bind(Array.prototype.filter);"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)}),Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.unbind=function(a){b(this,a)},Node.prototype.unbindAll=function(){if(this.bindings){for(var a=Object.keys(this.bindings),b=0;b<a.length;b++){var c=this.bindings[a[b]];c&&c.close()}this.bindings={}}},Text.prototype.bind=function(a,c,f){return"textContent"!==a?Node.prototype.bind.call(this,a,c,f):f?d(this,c):(b(this,"textContent"),d(this,c.open(e(this))),this.bindings.textContent=c)},Element.prototype.bind=function(a,c,d){var e="?"==a[a.length-1];return e&&(this.removeAttribute(a),a=a.slice(0,-1)),d?f(this,a,e,c):(b(this,a),f(this,a,e,c.open(g(this,a,e))),this.bindings[a]=c)};var s;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),s=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,d,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,d,e);this.removeAttribute(a);var f="checked"==a?m:c,g="checked"==a?o:k;return e?i(this,a,d,f):(b(this,a),l(this,a,d,g),i(this,a,d.open(j(this,a,f)),f),this.bindings[a]=d)},HTMLTextAreaElement.prototype.bind=function(a,d,e){return"value"!==a?HTMLElement.prototype.bind.call(this,a,d,e):(this.removeAttribute("value"),e?i(this,"value",d):(b(this,"value"),l(this,"value",d),i(this,"value",d.open(j(this,"value",c))),this.bindings.value=d))},HTMLOptionElement.prototype.bind=function(a,c,d){return"value"!==a?HTMLElement.prototype.bind.call(this,a,c,d):(this.removeAttribute("value"),d?p(this,c):(b(this,"value"),l(this,"value",c),p(this,c.open(q(this))),this.bindings.value=c))},HTMLSelectElement.prototype.bind=function(a,c,d){return"selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a?HTMLElement.prototype.bind.call(this,a,c,d):(this.removeAttribute(a),d?i(this,a,c):(b(this,a),l(this,a,c),i(this,a,c.open(j(this,a))),this.bindings[a]=c))}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(J[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(L);h(a)&&b(a),E(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument("");var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];I[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){N?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l,e.push(Path.get(n));var o=d&&d(n,b,c);e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);
-if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==H&&g!==F&&g!==G){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,H,c),d.bind=x(a,F,c),d.repeat=x(a,G,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",F,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){this.closed=!1,this.templateElement_=a,this.terminators=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var D,E=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?D=a.Map:(D=function(){this.keys=[],this.values=[]},D.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var F="bind",G="repeat",H="if",I={template:!0,repeat:!0,bind:!0,ref:!0},J={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},K="undefined"!=typeof HTMLTemplateElement;K&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var L="template, "+Object.keys(J).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),K||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var M,N="__proto__"in{};"function"==typeof MutationObserver&&(M=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&K,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=K,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=K)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var O=a.HTMLUnknownElement||HTMLElement,P={get:function(){return this.content_},enumerable:!0,configurable:!0};K||(HTMLTemplateElement.prototype=Object.create(O.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",P)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.unbind("ref"),this.bindings.ref=b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new C(this),this.bindings=this.bindings||{},this.bindings.iterator=this.iterator_),this.iterator_.updateDependencies(a,this.model_),M&&M.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0,this.bindings.iterator=void 0))},createInstance:function(a,b,c,d){b&&(c=this.newDelegate_(b)),this.refContent_||(this.refContent_=this.ref_.content);var e=this.refContent_,f=this.bindingMap_;f&&f.content===e||(f=B(e,c&&c.prepareBinding)||[],f.content=e,this.bindingMap_=f);var g=m(this),h=g.createDocumentFragment();h.templateCreator_=this,h.protoContent_=e;for(var i={firstNode:null,lastNode:null,model:a},j=0,k=e.firstChild;k;k=k.nextSibling){var l=A(k,h,g,f.children[j++],a,c,d);l.templateInstance_=i}return i.firstNode=h.firstChild,i.lastNode=h.lastChild,h.templateCreator_=void 0,h.protoContent_=void 0,h},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_=void 0,this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}return a?{raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}:{}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}}),Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}}),C.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(H,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(G,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(F,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getTerminatorAt:function(a){if(-1==a)return this.templateElement_;var b=this.terminators[2*a];if(b.nodeType!==Node.ELEMENT_NODE||this.templateElement_===b)return b;var c=b.iterator_;return c?c.getTerminatorAt(c.terminators.length/2-1):b},insertInstanceAt:function(a,b,c,d){var e=this.getTerminatorAt(a-1),f=e;b?f=b.lastChild||f:c&&(f=c[c.length-1]||f),this.terminators.splice(2*a,0,f,d);var g=this.templateElement_.parentNode,h=e.nextSibling;if(b)g.insertBefore(b,h);else if(c)for(var i=0;i<c.length;i++)g.insertBefore(c[i],h)},extractInstanceAt:function(a){var b=[],c=this.getTerminatorAt(a-1),d=this.getTerminatorAt(a);b.instanceBindings=this.terminators[2*a+1],this.terminators.splice(2*a,2);for(var e=this.templateElement_.parentNode;d!==c;){var f=c.nextSibling;f==d&&(d=c),e.removeChild(f),b.push(f)}return b},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));var d=new D,e=0;a.forEach(function(a){a.removed.forEach(function(b){var c=this.extractInstanceAt(a.index+e);d.set(b,c)},this),e-=a.addedCount},this),a.forEach(function(a){for(var e=a.index;e<a.index+a.addedCount;e++){var f,g=this.iteratedValue[e],h=void 0,i=d.get(g);i?(d.delete(g),f=i.instanceBindings):(f=[],this.instanceModelFn_&&(g=this.instanceModelFn_(g)),void 0!==g&&(h=b.createInstance(g,void 0,c,f))),this.insertInstanceAt(e,h,i,f)}},this),d.forEach(function(a){this.closeInstanceBindings(a.instanceBindings)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.getTerminatorAt(a-1),c=this.getTerminatorAt(a);if(b!==c){var d=b.nextSibling.templateInstance;this.instancePositionChangedFn_(d,a)}},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.terminators.length/2;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=0;b<a.length;b++)a[b].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=1;a<this.terminators.length;a+=2)this.closeInstanceBindings(this.terminators[a]);this.terminators.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&" ᠎              ".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b;for(a=C();v(".")||v("[");)v("[")?(b=G(),a=Z.createMemberExpression("[",a,b)):(b=F(),a=Z.createMemberExpression(".",a,b));return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=s[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),s[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.dynamicDeps="function"==typeof a||a.dynamic,this.dynamic="function"==typeof b||b.dynamic||"["==c,this.simplePath=!this.dynamic&&!this.dynamicDeps&&b instanceof e&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property="."==c?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a){return"o"===a[0]&&"n"===a[1]&&"-"===a[2]}function o(a,b){for(;a[w]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[w];return a}function p(a,b){if(0==b.length)return void 0;if(1==b.length)return o(a,b[0]);for(var c=0;null!=a&&c<b.length-1;c++)a=a[b[c]];return a}function q(a,b,c){var d=b.substring(3);return d=v[d]||d,function(b,e,f){function g(){return"{{ "+a+" }}"}var h,i,j;return j="function"==typeof c.resolveEventHandler?function(d){h=h||c.resolveEventHandler(b,a,e),h(d,d.detail,d.currentTarget),Platform&&"function"==typeof Platform.flush&&Platform.flush()}:function(c){h=h||a.getValueFrom(b),i=i||p(b,a,e),h.apply(i,[c,c.detail,c.currentTarget]),Platform&&"function"==typeof Platform.flush&&Platform.flush()},e.addEventListener(d,j),f?void 0:{open:g,discardChanges:g,close:function(){e.removeEventListener(d,j)}}}}function r(){}var s=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=o(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof e?this.object.name:this.object.fullPath;this.fullPath_=Path.get(a+"."+this.property.name)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.property instanceof e){var b=Path.get(this.property.name);this.valueFn_=function(c,d){var e=a(c,d);return d&&d.addPath(e,b),b.getValueFrom(e)}}else{var c=this.property;this.valueFn_=function(b,d){var e=a(b,d),f=c(b,d);return d&&d.addPath(e,f),e?e[f]:void 0}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=d;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find filter: "+this.name);if(b?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("No "+(b?"toModel":"toDOM")+" found on"+this.name);for(var h=[a],j=0;j<this.args.length;j++)h[j+1]=i(this.args[j])(d,e);return f.apply(g,h)}};var t={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},u={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!t[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return t[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!u[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return u[a](b(d,e),c(d,e))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e){return a(d,e)?b(d,e):c(d,e)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c){for(var d={},e=0;e<a.length;e++)d[a[e].key]=a[e].value(b,c);return d}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){g.dynamicDeps&&f.startReset();var c=g.getValue(a,g.dynamicDeps?f:void 0,b);return g.dynamicDeps&&f.finishReset(),c}function e(c){return g.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver;this.getValue(a,f,b);var g=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b),e=0;e<this.filters.length;e++)d=this.filters[e].transform(d,!1,c,a,b);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(b,!0,c,a);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var v={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){v[a.toLowerCase()]=a});var w="@"+Math.random().toString(36).slice(2);r.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);if(n(c))return e.valid?q(e,c,this):void console.error("on-* bindings must be simple path expressions");{if(!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=o(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){var e=Object.create(c);return e[b]=a,e[d]=void 0,e[w]=c,e}}}},a.PolymerExpressions=r,a.exposeGetExpression&&(a.getExpression_=c),a.PolymerExpressions.prepareEventBinding=q}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e,f=125;if(window.addEventListener("WebComponentsReady",function(){b(),Observer.hasObjectObserve||(a.flushPoll=setInterval(b,f))}),window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
+// @version: 0.2.0-e3985da
+function PointerGestureEvent(a,b){var c=b||{},d=document.createEvent("Event"),e={bubbles:Boolean(c.bubbles)===c.bubbles||!0,cancelable:Boolean(c.cancelable)===c.cancelable||!0};d.initEvent(a,e.bubbles,e.cancelable);for(var f,g=Object.keys(c),h=0;h<g.length;h++)f=g[h],d[f]=c[f];return d.preventTap=this.preventTap,d}"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)L="new",M="updated",N="reconfigured",O="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=P||b[1].type!=P?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:S(a)&&S(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:$.test(a))}function i(a,b){if(b!==_)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(R&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=ab[a];if(b)return b;if(!h(a))return bb;var b=new i(a,_);return ab[a]=b,b}function k(b){for(var c=0;db>c&&b.check_();)c++;return a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c),c>0}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(){if(!eb.length)return!1;for(var a=0;a<eb.length;a++)eb[a]();return eb.length=0,!0}function p(){function a(a){b&&b.state_===kb&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),gb.push(this)}}}function q(a,b,c){var d=gb.pop()||p();return d.open(a),d.observe(b,c),d}function r(){function a(b){if(f(b)){var c=j.indexOf(b);c>=0?(j[c]=void 0,i.push(b)):i.indexOf(b)<0&&(i.push(b),Object.observe(b,e)),a(Object.getPrototypeOf(b))}}function b(){var b=j===hb?[]:j;j=i,i=b;var c;for(var d in g)c=g[d],c&&c.state_==kb&&c.iterateObjects_(a);for(var f=0;f<j.length;f++){var h=j[f];h&&Object.unobserve(h,e)}j.length=0}function c(){l=!1,k&&b()}function d(){l||(k=!0,l=!0,fb(c))}function e(){b();var a;for(var c in g)a=g[c],a&&a.state_==kb&&a.check_()}var g=[],h=0,i=[],j=hb,k=!1,l=!1,m={object:void 0,objects:i,open:function(b){g[b.id_]=b,h++,b.iterateObjects_(a)},close:function(a){if(g[a.id_]=void 0,h--,h)return void d();k=!1;for(var b=0;b<i.length;b++)Object.unobserve(i[b],e),t.unobservedCount++;g.length=0,i.length=0,ib.push(this)},reset:d};return m}function s(a,b){return cb&&cb.object===b||(cb=ib.pop()||r(),cb.object=b),cb.open(a),cb}function t(){this.state_=jb,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nb++}function u(a){t._allObserversCount++,pb&&ob.push(a)}function v(){t._allObserversCount--}function w(a){t.call(this),this.value_=a,this.oldObject_=void 0}function x(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");w.call(this,a)}function y(a,b){t.call(this),this.object_=a,this.path_=b instanceof i?b:j(b),this.directObserver_=void 0}function z(){t.call(this),this.value_=[],this.directObserver_=void 0,this.observed_=[]}function A(a){return a}function B(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||A,this.setValueFn_=c||A,this.dontPassThroughSet_=d}function C(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function D(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];tb[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=M&&(g.type!=L?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function E(a,b,c){return{index:a,removed:b,addedCount:c}}function F(){}function G(a,b,c,d,e,f){return yb.calcSplices(a,b,c,d,e,f)}function H(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function I(a,b,c,d){for(var e=E(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=H(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function J(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case P:I(c,g.index,g.removed.slice(),g.addedCount);break;case L:case M:case O:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;I(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function K(a,b){var c=[];return J(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(G(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var L="add",M="update",N="reconfigure",O="delete",P="splice",Q=b(),R=c(),S=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},T="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},U="[$_a-zA-Z]",V="[$_a-zA-Z0-9]",W=U+"+"+V+"*",X="(?:[0-9]|[1-9]+[0-9]+)",Y="(?:"+W+"|"+X+")",Z="(?:"+Y+")(?:\\s*\\.\\s*"+Y+")*",$=new RegExp("^"+Z+"$"),_={},ab={};i.get=j,i.prototype=T({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!a)return;b(a)}},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++){{this[e]}c+=a[e],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[e],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var bb=new i("",_);bb.valid=!1,bb.getValueFrom=bb.setValueFrom=function(){};var cb,db=1e3,eb=[],fb=Q?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){o(),b=!1}),function(c){eb.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eb.push(a)}}(),gb=[],hb=[],ib=[],jb=0,kb=1,lb=2,mb=3,nb=1;t.prototype={open:function(a,b){if(this.state_!=jb)throw Error("Observer has already been opened.");return u(this),this.callback_=a,this.target_=b,this.state_=kb,this.connect_(),this.value_},close:function(){this.state_==kb&&(v(this),this.state_=lb,this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0)},deliver:function(){this.state_==kb&&k(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){t._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var ob,pb=!Q;t._allObserversCount=0,pb&&(ob=[]);var qb=!1,rb="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!qb){if(rb)return void Object.deliverAllChangeRecords();if(pb){qb=!0;var b,c,d=0;do{d++,c=ob,ob=[],b=!1;for(var e=0;e<c.length;e++){var f=c[e];f.state_==kb&&(f.check_()&&(b=!0),ob.push(f))}o()&&(b=!0)}while(db>d&&b);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=d),qb=!1}}},pb&&(a.Platform.clearObservers=function(){ob=[]}),w.prototype=T({__proto__:t.prototype,arrayObserve:!1,connect_:function(){Q?this.directObserver_=q(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(Q){if(!a)return!1;c={},b=D(this.value_,a,c)}else c=this.oldObject_,b=n(this.value_,this.oldObject_);return m(b)?!1:(Q||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){Q?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==kb&&(Q?this.directObserver_.deliver(!1):k(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),x.prototype=T({__proto__:w.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(Q){if(!a)return!1;b=K(this.value_,a)}else b=G(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(Q||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),x.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},y.prototype=T({__proto__:t.prototype,connect_:function(){Q&&(this.directObserver_=s(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||g(this.value_,c)?!1:(this.report_([this.value_,c]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var sb={};z.prototype=T({__proto__:t.prototype,connect_:function(){if(this.check_(void 0,!0),Q){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==sb){b=!0;break}return this.directObserver_?b?void this.directObserver_.reset():(this.directObserver_.close(),void(this.directObserver_=void 0)):void(b&&(this.directObserver_=s(this,a)))}},closeObservers_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===sb&&this.observed_[a+1].close();this.observed_.length=0},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0),this.closeObservers_()},addPath:function(a,b){if(this.state_!=jb&&this.state_!=mb)throw Error("Cannot add paths once started.");this.observed_.push(a,b instanceof i?b:j(b))},addObserver:function(a){if(this.state_!=jb&&this.state_!=mb)throw Error("Cannot add observers once started.");a.open(this.deliver,this),this.observed_.push(sb,a)},startReset:function(){if(this.state_!=kb)throw Error("Can only reset while open");this.state_=mb,this.closeObservers_()},finishReset:function(){if(this.state_!=mb)throw Error("Can only finishReset after startReset");return this.state_=kb,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==sb&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e=this.observed_[d+1],f=this.observed_[d],h=f===sb?e.discardChanges():e.getValueFrom(f);b?this.value_[d/2]=h:g(h,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=h)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),B.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!g(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var tb={};tb[L]=!0,tb[M]=!0,tb[O]=!0,t.defineComputedProperty=function(a,b,c){var d=C(a,b),e=c.open(function(a,b){e=a,d&&d(M,b)});return Object.defineProperty(a,b,{get:function(){return c.deliver(),e},set:function(a){return c.setValue(a),a},configurable:!0}),{close:function(){c.close(),Object.defineProperty(a,b,{value:e,writable:!0,configurable:!0})}}};var ub=0,vb=1,wb=2,xb=3;F.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(ub):(e.push(vb),d=g),b--,c--):f==h?(e.push(xb),b--,d=h):(e.push(wb),c--,d=i)}else e.push(xb),b--;else e.push(wb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=E(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[E(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case ub:j&&(l.push(j),j=void 0),m++,n++;break;case vb:j||(j=E(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case wb:j||(j=E(m,[],0)),j.addedCount++,m++;break;case xb:j||(j=E(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var yb=new F;a.Observer=t,a.Observer.runEOM_=fb,a.Observer.hasObjectObserve=Q,a.ArrayObserver=x,a.ArrayObserver.calculateSplices=function(a,b){return yb.calculateSplices(a,b)},a.ArraySplice=F,a.ObjectObserver=w,a.PathObserver=y,a.CompoundObserver=z,a.Path=i,a.ObserverTransform=B,a.Observer.changeRecordTypes={add:L,update:M,reconfigure:N,"delete":O,splice:P}}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return L(b).forEach(function(c){K(a,c,M(b,c))}),a}function d(a,b){return L(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}K(a,c,M(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=E.get(b);if(c)return c;var d=f(b),e=t(d);return q(b,e,a),e}function g(a,b){o(a,b,!0)}function h(a,b){o(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return H&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return H&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return H&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return O}}function o(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){N&&b.__lookupGetter__(g);var h,j,o=n(b,g);if(d&&"function"==typeof o.value)c[g]=m(g);else{var p=i(g);h=p?a.getEventHandlerGetter(g):k(g),(o.writable||o.set)&&(j=p?a.getEventHandlerSetter(g):l(g)),K(c,g,{get:h,set:j,configurable:o.configurable,enumerable:o.enumerable})}}}}function p(a,b,c){var e=a.prototype;q(e,b,c),d(b,a)}function q(a,c,d){var e=c.prototype;b(void 0===E.get(a)),E.set(a,c),F.set(e,a),g(a,e),d&&h(e,d),K(e,"constructor",{value:c,configurable:!0,enumerable:!1,writable:!0}),c.prototype=e}function r(a,b){return E.get(b.prototype)===a}function s(a){var b=Object.getPrototypeOf(a),c=f(b),d=t(c);return q(b,d,a),d}function t(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function u(a){return a instanceof G.EventTarget||a instanceof G.Event||a instanceof G.Range||a instanceof G.DOMImplementation||a instanceof G.CanvasRenderingContext2D||G.WebGLRenderingContext&&a instanceof G.WebGLRenderingContext}function v(a){return Q&&a instanceof Q||a instanceof S||a instanceof R||a instanceof T||a instanceof U||a instanceof P||a instanceof V||W&&a instanceof W||X&&a instanceof X}function w(a){return null===a?null:(b(v(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function x(a){return null===a?null:(b(u(a)),a.impl)}function y(a){return a&&u(a)?x(a):a}function z(a){return a&&!u(a)?w(a):a}function A(a,c){null!==c&&(b(v(a)),b(void 0===c||u(c)),a.polymerWrapper_=c)}function B(a,b,c){K(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function C(a,b){B(a,b,function(){return w(this.impl[b])})}function D(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=z(this);return a[b].apply(a,arguments)}})})}var E=new WeakMap,F=new WeakMap,G=Object.create(null),H=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(H)try{var I=new Function("","return true;");H=I()}catch(J){H=!1}var K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor;L(window);var N=/Firefox/.test(navigator.userAgent),O={get:function(){},set:function(){},configurable:!0,enumerable:!0},P=window.DOMImplementation,Q=window.EventTarget,R=window.Event,S=window.Node,T=window.Window,U=window.Range,V=window.CanvasRenderingContext2D,W=window.WebGLRenderingContext,X=window.SVGElementInstance;a.assert=b,a.constructorTable=E,a.defineGetter=B,a.defineWrapGetter=C,a.forwardMethodsToWrapper=D,a.isWrapper=u,a.isWrapperFor=r,a.mixin=c,a.nativePrototypeTable=F,a.oneOf=e,a.registerObject=s,a.registerWrapper=p,a.rewrap=A,a.unwrap=x,a.unwrapIfNeeded=y,a.wrap=w,a.wrapIfNeeded=z,a.wrappers=G}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.firstChild;d;d=d.nextSibling)c(d,b)}}function d(a){if(a.treeScope_)return a.treeScope_;var c,e=a.parentNode;return c=e?d(e):new b(a,null),a.treeScope_=c}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof P.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&O(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var m=null;if(g.length){if(c(i)&&(m=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(l(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,m,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a,b){return K(a)===K(b)}function m(a){return R.get(a)?void 0:(R.set(a,!0),n(O(a),O(a.target)))}function n(b,c){if(S.get(b))throw new Error("InvalidStateError");S.set(b,!0),a.renderAllPending();var d=g(c);return"load"===b.type&&2===d.length&&d[0].target instanceof P.Document&&d.shift(),$.set(b,d),o(b,d)&&p(b,d)&&q(b,d),W.set(b,t.NONE),U.delete(b,null),S.delete(b),b.defaultPrevented}function o(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=t.CAPTURING_PHASE,!r(b[d],a,c)))return!1}return!0}function p(a,b){var c=t.AT_TARGET;return r(b[0],a,c)}function q(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=t.AT_TARGET;else{if(!d||Y.get(a))continue;c=t.BUBBLING_PHASE}if(!r(b[e],a,c))return}}function r(a,b,c){var d=a.target,e=a.currentTarget,f=Q.get(e);if(!f)return!0;if("relatedTarget"in b){var g=N(b);if(g.relatedTarget){var h=O(g.relatedTarget),j=i(e,h);if(j===d)return!0;V.set(b,j)}}W.set(b,c);var k=b.type,l=!1;T.set(b,d),U.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===t.CAPTURING_PHASE||n.capture&&c===t.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),Y.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!X.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){return a instanceof _?void(this.impl=a):O(x(_,"Event",a,b))}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:N(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):O(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&L(e.prototype,c),d)try{M(d,e,new d("temp"))}catch(f){M(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=N(arguments[b]);var c=N(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(ib)return new a(c,u(d));var e=N(document.createEvent(b)),f=hb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=N(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(){t.call(this)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof P.ShadowRoot&&(a=a.host),N(a)}function D(a,b){var c=Q.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=N(a);c;c=c.parentNode)if(D(O(c),b))return!0;return!1}function F(a){J(a,lb)}function G(b,c,d,e){a.renderAllPending();for(var f=O(mb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function H(a){return function(){var b=Z.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=Z.get(this);d||(d=Object.create(null),Z.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.getTreeScope,L=a.mixin,M=a.registerWrapper,N=a.unwrap,O=a.wrap,P=a.wrappers,Q=(new WeakMap,new WeakMap),R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var _=window.Event;_.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return T.get(this)},get currentTarget(){return U.get(this)},get eventPhase(){return W.get(this)},get path(){var a=new P.NodeList,b=$.get(this);if(b){for(var c=0,d=b.length-1,e=K(U.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=K(g);h.contains(e)&&(f!==d||g instanceof P.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){X.set(this,!0)},stopImmediatePropagation:function(){X.set(this,!0),Y.set(this,!0)}},M(_,t,document.createEvent("Event"));
+var ab=v("UIEvent",t),bb=v("CustomEvent",t),cb={get relatedTarget(){return V.get(this)||O(N(this).relatedTarget)}},db=L({initMouseEvent:w("initMouseEvent",14)},cb),eb=L({initFocusEvent:w("initFocusEvent",5)},cb),fb=v("MouseEvent",ab,db),gb=v("FocusEvent",ab,eb),hb=Object.create(null),ib=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!ib){var jb=function(a,b,c){if(c){var d=hb[c];b=L(L({},d),b)}hb[a]=b};jb("Event",{bubbles:!1,cancelable:!1}),jb("CustomEvent",{detail:null},"Event"),jb("UIEvent",{view:null,detail:0},"Event"),jb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),jb("FocusEvent",{relatedTarget:null},"UIEvent")}y.prototype=Object.create(t.prototype),L(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}});var kb=window.EventTarget,lb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;lb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=Q.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],Q.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=Q.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=N(b),d=c.type;R.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return N(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},kb&&M(kb,B);var mb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=bb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.UIEvent=ab}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);N=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;N=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&U.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,U.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=K(c?O.call(c,a.impl,!1):P.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof M.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof Q),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.wrap,L=a.wrapIfNeeded,M=a.wrappers,N=!1,O=document.importNode,P=window.Node.prototype.cloneNode,Q=window.Node,R=window.DocumentFragment,S=(Q.prototype.appendChild,Q.prototype.compareDocumentPosition),T=Q.prototype.insertBefore,U=Q.prototype.removeChild,V=Q.prototype.replaceChild,W=/Trident/.test(navigator.userAgent),X=W?function(a,b){try{U.call(a,b)}catch(c){if(!(a instanceof R))throw c}}:function(a,b){U.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=K(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),T.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1]);var j=d?d.parentNode:this.impl;j?T.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&X(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),X(this.impl,f);return N||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=K(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),V.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&V.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:K(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:K(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:K(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:K(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:K(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,L(a))},compareDocumentPosition:function(a){return S.call(this.impl,J(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,cleanUpNodes(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(Q,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.wrappers,o=window.Element,p=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return o.prototype[a]}),q=p[0],r=o.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new n.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return r.call(this.impl,a)}}),p.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),o.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),m(o,d,document.createElementNS(null,"x")),a.matchesNames=p,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){"object"==typeof a&&(a=f(a)),f(this).remove(a)},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.registerObject,c="http://www.w3.org/2000/svg",d=document.createElementNS(c,"title"),e=b(d),f=Object.getPrototypeOf(e.prototype).constructor;a.wrappers.SVGElement=f}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this),this.treeScope_=new d(this,g(a));var e=a.shadowRoot;m.set(this,e),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){var b=I.get(a);return b||I.set(a,b=[]),b}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if("*"===c||c===a.localName)return!0;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++){var b=P[a],c=b.parentRenderer;c&&c.dirty||b.render()}P=[]}function l(){y=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){var b=E(a).root;return b instanceof D?b:null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof A}function s(a){return a instanceof A}function t(a){return a instanceof B}function u(a){return a instanceof B}function v(a){return a.shadowRoot
+}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,b)}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),O=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),y)return;y=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=function(){return k(),g(this)},B.prototype.nodeIsInserted_=A.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):c.extends?document.createElement(c.extends,b):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var k={prototype:i};c.extends&&(k.extends=c.extends),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i);F.call(z(this),b,k);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))}}),f(k,b),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(){window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot}(),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return!f||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonAncestor(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonAncestor:function(a){return this.convertColonRule(a,cssColonAncestorRe,this.colonAncestorPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonAncestorPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){return a.replace(/\^\^/g," ").replace(/\^/g," ")},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.type===CSSRule.MEDIA_RULE?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(hostRe,s).replace(colonHostRe,s).replace(colonAncestorRe,t)},propertiesFromRule:function(a){return a.style.content&&!a.style.content.match(/['"]+/)?a.style.cssText.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"):a.style.cssText},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcssancestor",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonAncestorRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",hostRe=/@host/gim,colonHostRe=/\:host/gim,colonAncestorRe=/\:ancestor/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillAncestorRe=new RegExp(t,"gim");var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a)}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.templateContent=window.templateContent||function(a){return a.content},window.wrap=window.unwrap=function(a){return a};var a=Element.prototype.webkitCreateShadowRoot;Element.prototype.webkitCreateShadowRoot=function(){var b=this.webkitShadowRoot,c=a.call(this);return c.olderShadowRoot=b,c.host=this,CustomElements.watchShadow(this),c},Object.defineProperties(Element.prototype,{shadowRoot:{get:function(){return this.webkitShadowRoot}},createShadowRoot:{value:function(){return this.webkitCreateShadowRoot()}}}),window.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),window.templateContent=window.templateContent||function(a){return a.content},function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");
+c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.module=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d){return a.replace(d,function(a,d,e,f){var g=e.replace(/["']/g,"");return g=c(b,g),d+"'"+g+"'"+f})}function c(a,b){var c=new URL(b,a);return d(c.href)}function d(a){var b=document.baseURI,c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b.pathname,c.pathname):a}function e(a,b){for(var c=a.split("/"),d=b.split("/");c.length&&c[0]===d[0];)c.shift(),d.shift();for(var e=0,f=c.length-1;f>e;e++)d.unshift("..");return d.join("/")}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c){return a=b(a,c,g),b(a,c,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,b){b=b||a.ownerDocument.baseURI,i.forEach(function(d){var e=a.attributes[d];if(e&&e.value&&e.value.search(k)<0){var f=c(b,e.value);e.value=f}})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){c.load&&console.log("fetch",a,d);var e=function(b,c){this.receive(a,d,b,c)}.bind(this);b.load(a,e)},receive:function(a,b,c,d){this.cache[a]=d;for(var e,f=this.pending[a],g=0,h=f.length;h>g&&(e=f[g]);g++)this.onload(a,e,d),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){4===f.readyState&&d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a),this.parseNext()},parseImport:function(a){if(a.import.__importParsed=!0,HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.markParsingComplete(a)},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a)};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,m)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(m)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||n,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===u}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===u)&&(b.removeEventListener(v,c),g(a,b))};b.addEventListener(v,c)}}function h(a,b){function c(){f==g&&requestAnimationFrame(a)}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return k?a.import&&"loading"!==a.import.readyState:a.__importParsed}var j="import"in document.createElement("link"),k=j,l=a.flags,m="import",n=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(k)var o={};else var p=(a.xhr,a.Loader),q=a.parser,o={documents:{},documentPreloadSelectors:"link[rel="+m+"]",importsPreloadSelectors:["link[rel="+m+"]"].join(","),loadNode:function(a){r.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);r.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===n?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(l.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}q.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),q.parseNext()},loadedAll:function(){q.parseNext()}},r=new p(o.loaded.bind(o),o.loadedAll.bind(o));var s={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",s),Object.defineProperty(n,"_currentScript",s),!document.baseURI){var t={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",t),Object.defineProperty(n,"baseURI",t)}var u=HTMLImports.isIE?"complete":"interactive",v="readystatechange";a.hasNative=j,a.useNative=k,a.importer=o,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=m,a.isImportLoaded=i,a.importLoader=r}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e=0,g=a.length;g>e&&(b=a[e]);e++)d(b)&&f.loadNode(b),b.children&&b.children.length&&c(b.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,f){var g=f||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(m(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!g.prototype)throw new Error("Options missing required prototype property");return g.__name=b.toLowerCase(),g.lifecycle=g.lifecycle||{},g.ancestry=c(g.extends),d(g),e(g),k(g.prototype),n(g.__name,g),g.ctor=o(g),g.ctor.prototype=g.prototype,g.prototype.constructor=g.ctor,a.ready&&a.upgradeDocumentTree(document),g.ctor}function c(a){var b=m(a);return b?c(b.extends).concat([b]):[]}function d(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function e(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag);b=Object.getPrototypeOf(c)}for(var d,e=a.prototype;e&&e!==b;){var d=Object.getPrototypeOf(e);e.__proto__=d,e=d}}a.native=b}function f(a){return g(z(a.tag),a)}function g(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),h(b,c),b.__upgraded__=!0,j(b),a.insertedNode(b),a.upgradeSubtree(b),b}function h(a,b){Object.__proto__?a.__proto__=b.prototype:(i(a,b.prototype,b.native),a.__proto__=b.prototype)}function i(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function j(a){a.createdCallback&&a.createdCallback()}function k(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){l.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){l.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function l(a,b,c){var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function m(a){return a?x[a.toLowerCase()]:void 0}function n(a,b){x[a]=b}function o(a){return function(){return f(a)}}function p(a,b,c){return a===y?q(b,c):A(a,b)}function q(a,b){var c=m(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=q(a);return d.setAttribute("is",b),d}var d=z(a);return a.indexOf("-")>=0&&h(d,HTMLElement),d}function r(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=m(b||a.localName);if(c){if(b&&c.tag==a.localName)return g(a,c);if(!b&&!c.extends)return g(a,c)}}}function s(b){var c=B.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var t=a.flags,u=Boolean(document.registerElement),v=!t.register&&u&&!window.ShadowDOMPolyfill;if(v){var w=function(){};a.registry={},a.upgradeElement=w,a.watchShadow=w,a.upgrade=w,a.upgradeAll=w,a.upgradeSubtree=w,a.observeDocument=w,a.upgradeDocument=w,a.upgradeDocumentTree=w,a.takeRecords=w}else{var x={},y="http://www.w3.org/1999/xhtml",z=document.createElement.bind(document),A=document.createElementNS.bind(document),B=Node.prototype.cloneNode;document.registerElement=b,document.createElement=q,document.createElementNS=p,Node.prototype.cloneNode=s,a.registry=x,a.upgrade=r}var C;C=Object.__proto__||v?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=C,document.register=document.registerElement,a.hasNative=u,a.useNative=v}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b);this.fetch(d,{},c)},fetch:function(a,b,d){var e=a.length;if(!e)return d(b);for(var f,g,h,i=function(){0===--e&&d(b)},j=function(a,c){var d=c.match,e=d.url;if(a)return b[e]="",i();var f=c.response||c.responseText;b[e]=f,this.fetch(this.extractUrls(f,e),b,i)},k=0;e>k;k++)f=a[k],h=f.url,b[h]?c(i):(g=this.xhr(h,j,this),g.match=f,b[h]=g)},xhr:function(a,b,c){var d=new XMLHttpRequest;return d.open("GET",a,!0),d.send(),d.onload=function(){b.call(c,null,d)},d.onerror=function(){b.call(c,null,d)},d}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b){var c=a.textContent,d=a.ownerDocument.baseURI,e=function(c){a.textContent=c,b(a)};this.resolve(c,d,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f),g=this.flatten(g,f,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b){function c(){e++,e===f&&b&&b()}for(var d,e=0,f=a.length,g=0;f>g&&(d=a[g]);g++)this.resolveNode(d,c)}};var e=new b;a.styleResolver=e}(window.Platform),function(a){a=a||{},a.external=a.external||{};var b={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d}e=this.olderShadow(e)}return f}},owner:function(a){for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),window.PointerEventsPolyfill=a}(window.PointerEventsPolyfill),function(){function a(a){return"body ^^ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; touch-action-delay: none; }"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],e="";d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",e+=a(d)+c(d)+"\n"):(e+=d.selectors.map(b)+c(d.rule)+"\n",e+=d.selectors.map(a)+c(d.rule)+"\n")});var f=document.createElement("style");f.textContent=e,document.head.appendChild(f)}(),function(a){function b(a,e){e=e||{};var f=e.buttons;if(!d&&!f&&"touch"!==a)switch(e.which){case 1:f=1;break;case 2:f=4;break;case 3:f=2;break;default:f=0}var i;if(c)i=new MouseEvent(a,e);else{i=document.createEvent("MouseEvent");for(var j,k={},l=0;l<g.length;l++)j=g[l],k[j]=e[j]||h[l];i.initMouseEvent(a,k.bubbles,k.cancelable,k.view,k.detail,k.screenX,k.screenY,k.clientX,k.clientY,k.ctrlKey,k.altKey,k.shiftKey,k.metaKey,k.button,k.relatedTarget)}i.__proto__=b.prototype,d||Object.defineProperty(i,"buttons",{get:function(){return f},enumerable:!0});var m=0;return m=e.pressure?e.pressure:f?.5:0,Object.defineProperties(i,{pointerId:{value:e.pointerId||0,enumerable:!0},width:{value:e.width||0,enumerable:!0},height:{value:e.height||0,enumerable:!0},pressure:{value:m,enumerable:!0},tiltX:{value:e.tiltX||0,enumerable:!0},tiltY:{value:e.tiltY||0,enumerable:!0},pointerType:{value:e.pointerType||"",enumerable:!0},hwTimestamp:{value:e.hwTimestamp||0,enumerable:!0},isPrimary:{value:e.isPrimary||!1,enumerable:!0}}),i}var c=!1,d=!1;try{var e=new MouseEvent("click",{buttons:1});c=!0,d=1===e.buttons,e=null}catch(f){}var g=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget"],h=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null];b.prototype=Object.create(MouseEvent.prototype),a.PointerEvent||(a.PointerEvent=b)}(window),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);
+c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PointerEventsPolyfill),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0],d="undefined"!=typeof SVGElementInstance,e={targets:new WeakMap,handledEvents:new WeakMap,pointermap:new a.PointerMap,eventMap:{},eventSources:{},eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},contains:a.external.contains||function(a,b){return a.contains(b)},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.contains(a.target,a.relatedTarget)||this.leave(a)},enterOver:function(a){this.over(a),this.contains(a.target,a.relatedTarget)||this.enter(a)},eventHandler:function(a){if(!this.handledEvents.get(a)){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),this.handledEvents.set(a,!0)}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:a.external.addEvent||function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:a.external.removeEvent||function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){this.captureInfo&&(b.relatedTarget=null);var c=new PointerEvent(a,b);return b.preventDefault&&(c.preventDefault=b.preventDefault),this.targets.set(c,this.targets.get(b)||b.target),c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f={},g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],!d||"target"!==e&&"relatedTarget"!==e||f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return a.preventDefault&&(f.preventDefault=function(){a.preventDefault()}),f},getTarget:function(a){return this.captureInfo&&this.captureInfo.id===a.pointerId?this.captureInfo.target:this.targets.get(a)},setCapture:function(a,b){this.captureInfo&&this.releaseCapture(this.captureInfo.id),this.captureInfo={id:a,target:b};var c=new PointerEvent("gotpointercapture",{bubbles:!0});this.implicitRelease=this.releaseCapture.bind(this,a),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease),this.targets.set(c,b),this.asyncDispatchEvent(c)},releaseCapture:function(a){if(this.captureInfo&&this.captureInfo.id===a){var b=new PointerEvent("lostpointercapture",{bubbles:!0}),c=this.captureInfo.target;this.captureInfo=null,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease),this.targets.set(b,c),this.asyncDispatchEvent(b)}},dispatchEvent:a.external.dispatchEvent||function(a){var b=this.getTarget(a);return b?b.dispatchEvent(a):void 0},asyncDispatchEvent:function(a){setTimeout(this.dispatchEvent.bind(this,a),0)}};e.boundHandler=e.eventHandler.bind(e),a.dispatcher=e,a.register=e.register.bind(e),a.unregister=e.unregister.bind(e)}(window.PointerEventsPolyfill),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a),d=c.preventDefault;return c.preventDefault=function(){a.preventDefault(),d()},c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.has(this.POINTER_ID);d&&this.cancel(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,a),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.move(c)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d&&d.button===a.button){var e=this.prepareEvent(a);b.up(e),this.cleanupMouse()}}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.enterOver(c)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.leaveOut(c)}},cancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanupMouse()},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=e}(window.PointerEventsPolyfill),function(a){var b,c=a.dispatcher,d=a.findTarget,e=a.targetFinding.allShadows.bind(a.targetFinding),f=c.pointermap,g=Array.prototype.map.call.bind(Array.prototype.map),h=2500,i=200,j="touch-action",k=!1,l={scrollType:new WeakMap,events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){k?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){k&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(j),d=this.touchActionToScrollType(b);d&&(this.scrollType.set(a,d),c.listen(a,this.events),e(a).forEach(function(a){this.scrollType.set(a,d),c.listen(a,this.events)},this))},elementRemoved:function(a){this.scrollType["delete"](a),c.unlisten(a,this.events),e(a).forEach(function(a){this.scrollType["delete"](a),c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(j),d=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);d&&f?(this.scrollType.set(a,d),e(a).forEach(function(a){this.scrollType.set(a,d)},this)):f?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===f.pointers()||1===f.pointers()&&f.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,i)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},touchToPointer:function(a){var b=c.cloneEvent(a);return b.pointerId=a.identifier+2,b.target=d(b),b.bubbles=!0,b.cancelable=!0,b.detail=this.clickCount,b.button=0,b.buttons=this.typeToButtons(this.currentTouchEvent),b.width=a.webkitRadiusX||a.radiusX||0,b.height=a.webkitRadiusY||a.radiusY||0,b.pressure=a.webkitForce||a.force||.5,b.isPrimary=this.isPrimaryTouch(a),b.pointerType=this.POINTER_TYPE,b},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a.type;var d=g(c,this.touchToPointer,this);d.forEach(function(b){b.preventDefault=function(){this.scrolling=!1,this.firstXY=null,a.preventDefault()}},this),d.forEach(b,this)},shouldScroll:function(a){if(this.firstXY){var b,c=this.scrollType.get(a.currentTarget);if("none"===c)b=!1;else if("XY"===c)b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(f.pointers()>=b.length){var c=[];f.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(this.touchToPointer(e))}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){f.set(a.pointerId,{target:a.target,out:a,outTarget:a.target});c.over(a),c.enter(a),c.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,d=f.get(b.pointerId);if(d){var e=d.out,g=d.outTarget;c.move(b),e&&g!==b.target&&(e.relatedTarget=b.target,b.relatedTarget=g,e.target=g,b.target?(c.leaveOut(e),c.enterOver(b)):(b.target=g,b.relatedTarget=null,this.cancelOut(b))),d.out=b,d.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(c.up(a),c.out(a),c.leave(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){c.cancel(a),c.out(a),c.leave(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){f["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var f=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(f,h)}}};k||(b=new a.Installer(l.elementAdded,l.elementRemoved,l.elementChanged,l)),a.touchEvents=l}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return d&&(c=b.cloneEvent(a),c.pointerType=this.POINTER_TYPES[a.pointerType]),c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(a){c.set(a.pointerId,a);var d=this.prepareEvent(a);b.down(d)},MSPointerMove:function(a){var c=this.prepareEvent(a);b.move(c)},MSPointerUp:function(a){var c=this.prepareEvent(a);b.up(c),this.cleanup(a.pointerId)},MSPointerOut:function(a){var c=this.prepareEvent(a);b.leaveOut(c)},MSPointerOver:function(a){var c=this.prepareEvent(a);b.enterOver(c)},MSPointerCancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var c=b.makeEvent("lostpointercapture",a);b.dispatchEvent(c)},MSGotPointerCapture:function(a){var c=b.makeEvent("gotpointercapture",a);b.dispatchEvent(c)}};a.msEvents=e}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher;if(void 0===window.navigator.pointerEnabled){if(Object.defineProperty(window.navigator,"pointerEnabled",{value:!0,enumerable:!0}),window.navigator.msPointerEnabled){var c=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:c,enumerable:!0}),b.registerSource("ms",a.msEvents)}else b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents);b.register(document)}}(window.PointerEventsPolyfill),function(a){function b(a){if(!e.pointermap.has(a))throw new Error("InvalidPointerId")}var c,d,e=a.dispatcher,f=window.navigator;f.msPointerEnabled?(c=function(a){b(a),this.msSetPointerCapture(a)},d=function(a){b(a),this.msReleasePointerCapture(a)}):(c=function(a){b(a),e.setCapture(a,this)},d=function(a){b(a),e.releaseCapture(a,this)}),window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:c},releasePointerCapture:{value:d}})}(window.PointerEventsPolyfill),PointerGestureEvent.prototype.preventTap=function(){this.tapPrevented=!0},function(a){a=a||{},a.utils={LCA:{find:function(a,b){if(a===b)return a;if(a.contains){if(a.contains(b))return a;if(b.contains(a))return b}var c=this.depth(a),d=this.depth(b),e=c-d;for(e>0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=this.walk(a,1),b=this.walk(b,1);return a},walk:function(a,b){for(var c=0;b>c;c++)a=a.parentNode;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode;return b}}},a.findLCA=function(b,c){return a.utils.LCA.find(b,c)},window.PointerGestures=a}(window.PointerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PointerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","screenX","screenY","pageX","pageY","tapPrevented"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],d={handledEvents:new WeakMap,targets:new WeakMap,handlers:{},recognizers:{},events:{},registerRecognizer:function(a,b){var c=b;this.recognizers[a]=c,c.events.forEach(function(a){if(c[a]){this.events[a]=!0;var b=c[a].bind(c);this.addHandler(a,b)}},this)},addHandler:function(a,b){var c=a;this.handlers[c]||(this.handlers[c]=[]),this.handlers[c].push(b)},registerTarget:function(a){this.listen(Object.keys(this.events),a)},unregisterTarget:function(a){this.unlisten(Object.keys(this.events),a)},eventHandler:function(a){if(!this.handledEvents.get(a)){var b=a.type,c=this.handlers[b];c&&this.makeQueue(c,a),this.handledEvents.set(a,!0)}},makeQueue:function(a,b){var c=this.cloneEvent(b);setTimeout(this.runQueue.bind(this,a,c),0)},runQueue:function(a,b){this.currentPointerId=b.pointerId;for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)c(b);this.currentPointerId=0},listen:function(a,b){a.forEach(function(a){this.addEvent(a,this.boundHandler,!1,b)},this)},unlisten:function(a){a.forEach(function(a){this.removeEvent(a,this.boundHandler,!1,inTarget)},this)},addEvent:function(a,b,c,d){d.addEventListener(a,b,c)},removeEvent:function(a,b,c,d){d.removeEventListener(a,b,c)},makeEvent:function(a,b){return new PointerGestureEvent(a,b)},cloneEvent:function(a){for(var d,e={},f=0;f<b.length;f++)d=b[f],e[d]=a[d]||c[f];return e},dispatchEvent:function(a,b){var c=b||this.targets.get(a);c&&(c.dispatchEvent(a),a.tapPrevented&&this.preventTap(this.currentPointerId))},asyncDispatchEvent:function(a,b){var c=function(){this.dispatchEvent(a,b)}.bind(this);setTimeout(c,0)},preventTap:function(a){var b=this.recognizers.tap;b&&b.preventTap(a)}};d.boundHandler=d.eventHandler.bind(d),d.registerQueue=[],d.immediateRegister=!1,a.dispatcher=d,a.register=function(b){if(d.immediateRegister){var c=window.PointerEventsPolyfill;c&&c.register(b),a.dispatcher.registerTarget(b)}else d.registerQueue.push(b)},a.register(document)}(window.PointerGestures),function(a){var b=a.dispatcher,c={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["pointerdown","pointermove","pointerup","pointercancel"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},pointerdown:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},pointerup:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},pointercancel:function(){this.cancel()},pointermove:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,c){var d={pointerType:this.heldPointer.pointerType,clientX:this.heldPointer.clientX,clientY:this.heldPointer.clientY};c&&(d.holdTime=c);var e=b.makeEvent(a,d);b.dispatchEvent(e,this.target),e.tapPrevented&&b.preventTap(this.heldPointer.pointerId)}};b.registerRecognizer("hold",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,c,d){var e=d,f=this.calcPositionDelta(e.downEvent,c),g=this.calcPositionDelta(e.lastMoveEvent,c);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h={dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,clientX:c.clientX,clientY:c.clientY,pageX:c.pageX,pageY:c.pageY,screenX:c.screenX,screenY:c.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:c.target,pointerType:c.pointerType},i=b.makeEvent(a,h);e.lastMoveEvent=c,b.dispatchEvent(i,e.downTarget)},pointerdown:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};c.set(a.pointerId,b)}},pointermove:function(a){var b=c.get(a.pointerId);if(b)if(b.tracking)this.fireTrack("track",a,b);else{var d=this.calcPositionDelta(b.downEvent,a),e=d.x*d.x+d.y*d.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}},pointerup:function(a){var b=c.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),c.delete(a.pointerId))},pointercancel:function(a){this.pointerup(a)}};b.registerRecognizer("track",d)}(window.PointerGestures),function(a){var b=a.dispatcher,c={MIN_VELOCITY:.5,MAX_QUEUE:4,moveQueue:[],target:null,pointerId:null,events:["pointerdown","pointermove","pointerup","pointercancel"],pointerdown:function(a){a.isPrimary&&!this.pointerId&&(this.pointerId=a.pointerId,this.target=a.target,this.addMove(a))},pointermove:function(a){a.pointerId===this.pointerId&&this.addMove(a)},pointerup:function(a){a.pointerId===this.pointerId&&this.fireFlick(a),this.cleanup()},pointercancel:function(){this.cleanup()},cleanup:function(){this.moveQueue=[],this.target=null,this.pointerId=null},addMove:function(a){this.moveQueue.length>=this.MAX_QUEUE&&this.moveQueue.shift(),this.moveQueue.push(a)},fireFlick:function(a){for(var c,d,e,f,g,h,i,j=a,k=this.moveQueue.length,l=0,m=0,n=0,o=0;k>o&&(i=this.moveQueue[o]);o++)c=j.timeStamp-i.timeStamp,d=j.clientX-i.clientX,e=j.clientY-i.clientY,f=d/c,g=e/c,h=Math.sqrt(f*f+g*g),h>n&&(l=f,m=g,n=h);var p=Math.abs(l)>Math.abs(m)?"x":"y",q=this.calcAngle(l,m);if(Math.abs(n)>=this.MIN_VELOCITY){var r=b.makeEvent("flick",{xVelocity:l,yVelocity:m,velocity:n,angle:q,majorAxis:p,pointerType:a.pointerType});b.dispatchEvent(r,this.target)}},calcAngle:function(a,b){return 180*Math.atan2(b,a)/Math.PI}};b.registerRecognizer("flick",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d=180/Math.PI,e={events:["pointerdown","pointermove","pointerup","pointercancel"],reference:{},pointerdown:function(b){if(c.set(b.pointerId,b),2==c.pointers()){var d=this.calcChord(),e=this.calcAngle(d);this.reference={angle:e,diameter:d.diameter,target:a.findLCA(d.a.target,d.b.target)}}},pointerup:function(a){c.delete(a.pointerId)},pointermove:function(a){c.has(a.pointerId)&&(c.set(a.pointerId,a),c.pointers()>1&&this.calcPinchRotate())},pointercancel:function(a){this.pointerup(a)},dispatchPinch:function(a,c){var d=a/this.reference.diameter,e=b.makeEvent("pinch",{scale:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},dispatchRotate:function(a,c){var d=Math.round((a-this.reference.angle)%360),e=b.makeEvent("rotate",{angle:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.dispatchPinch(b,a),c!=this.reference.angle&&this.dispatchRotate(c,a)},calcChord:function(){var a=[];c.forEach(function(b){a.push(b)});for(var b,d,e,f=0,g={},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),d=Math.abs(i.clientY-k.clientY),e=b+d,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,d=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:d},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*d)%360}};b.registerRecognizer("pinch",e)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel","keyup"],pointerdown:function(a){a.isPrimary&&!a.tapPrevented&&c.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},pointermove:function(a){if(a.isPrimary){var b=c.get(a.pointerId);b&&a.tapPrevented&&c.delete(a.pointerId)}},shouldTap:function(a,b){return a.tapPrevented?void 0:"mouse"===a.pointerType?1===b.buttons:!0},pointerup:function(d){var e=c.get(d.pointerId);if(e&&this.shouldTap(d,e)){var f=a.findLCA(e.target,d.target);if(f){var g=b.makeEvent("tap",{x:d.clientX,y:d.clientY,detail:d.detail,pointerType:d.pointerType});b.dispatchEvent(g,f)}}c.delete(d.pointerId)},pointercancel:function(a){c.delete(a.pointerId)},keyup:function(a){var c=a.keyCode;if(32===c){var d=a.target;d instanceof HTMLInputElement||d instanceof HTMLTextAreaElement||b.dispatchEvent(b.makeEvent("tap",{x:0,y:0,detail:0,pointerType:"unavailable"}),d)}},preventTap:function(a){c.delete(a)}};b.registerRecognizer("tap",d)}(window.PointerGestures),function(a){function b(){c.immediateRegister=!0;var b=c.registerQueue;b.forEach(a.register),b.length=0}var c=a.dispatcher;"complete"===document.readyState?b():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&b()})}(window.PointerGestures),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b){var c=a.bindings;if(!c)return void(a.bindings={});var d=c[b];d&&(d.close(),c[b]=void 0)}function c(a){return null==a?"":a}function d(a,b){a.data=c(b)}function e(a){return function(b){return d(a,b)}}function f(a,b,d,e){return d?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,c(e))}function g(a,b,c){return function(d){f(a,b,c,d)}}function h(a){switch(a.type){case"checkbox":return s;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function i(a,b,d,e){a[b]=(e||c)(d)}function j(a,b,c){return function(d){return i(a,b,d,c)}}function k(){}function l(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||k)(a),Platform.performMicrotaskCheckpoint()}var f=h(a);a.addEventListener(f,e);var g=c.close;c.close=function(){g&&(a.removeEventListener(f,e),c.close=g,c.close(),g=void 0)}}function m(a){return Boolean(a)}function n(b){if(b.form)return r(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return r(d,function(a){return a!=b&&!a.form})}function o(a){"INPUT"===a.tagName&&"radio"===a.type&&n(a).forEach(function(a){var b=a.bindings.checked;b&&b.setValue(!1)})}function p(a,b){var d,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings&&g.bindings.value&&(d=g,e=d.bindings.value,f=d.value),a.value=c(b),d&&d.value!=f&&(e.setValue(d.value),e.discardChanges(),Platform.performMicrotaskCheckpoint())}function q(a){return function(b){p(a,b)}}var r=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.unbind=function(a){b(this,a)},Node.prototype.unbindAll=function(){if(this.bindings){for(var a=Object.keys(this.bindings),b=0;b<a.length;b++){var c=this.bindings[a[b]];c&&c.close()}this.bindings={}}},Text.prototype.bind=function(a,c,f){return"textContent"!==a?Node.prototype.bind.call(this,a,c,f):f?d(this,c):(b(this,"textContent"),d(this,c.open(e(this))),this.bindings.textContent=c)},Element.prototype.bind=function(a,c,d){var e="?"==a[a.length-1];return e&&(this.removeAttribute(a),a=a.slice(0,-1)),d?f(this,a,e,c):(b(this,a),f(this,a,e,c.open(g(this,a,e))),this.bindings[a]=c)};var s;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),s=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,d,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,d,e);this.removeAttribute(a);var f="checked"==a?m:c,g="checked"==a?o:k;return e?i(this,a,d,f):(b(this,a),l(this,a,d,g),i(this,a,d.open(j(this,a,f)),f),this.bindings[a]=d)},HTMLTextAreaElement.prototype.bind=function(a,d,e){return"value"!==a?HTMLElement.prototype.bind.call(this,a,d,e):(this.removeAttribute("value"),e?i(this,"value",d):(b(this,"value"),l(this,"value",d),i(this,"value",d.open(j(this,"value",c))),this.bindings.value=d))},HTMLOptionElement.prototype.bind=function(a,c,d){return"value"!==a?HTMLElement.prototype.bind.call(this,a,c,d):(this.removeAttribute("value"),d?p(this,c):(b(this,"value"),l(this,"value",c),p(this,c.open(q(this))),this.bindings.value=c))},HTMLSelectElement.prototype.bind=function(a,c,d){return"selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a?HTMLElement.prototype.bind.call(this,a,c,d):(this.removeAttribute(a),d?i(this,a,c):(b(this,a),l(this,a,c),i(this,a,c.open(j(this,a))),this.bindings[a]=c))}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(J[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(L);h(a)&&b(a),E(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument("");var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];I[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b
+}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){N?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l,e.push(Path.get(n));var o=d&&d(n,b,c);e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==H&&g!==F&&g!==G){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,H,c),d.bind=x(a,F,c),d.repeat=x(a,G,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",F,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){this.closed=!1,this.templateElement_=a,this.terminators=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var D,E=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?D=a.Map:(D=function(){this.keys=[],this.values=[]},D.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var F="bind",G="repeat",H="if",I={template:!0,repeat:!0,bind:!0,ref:!0},J={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},K="undefined"!=typeof HTMLTemplateElement;K&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var L="template, "+Object.keys(J).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),K||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var M,N="__proto__"in{};"function"==typeof MutationObserver&&(M=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&K,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=K,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=K)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var O=a.HTMLUnknownElement||HTMLElement,P={get:function(){return this.content_},enumerable:!0,configurable:!0};K||(HTMLTemplateElement.prototype=Object.create(O.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",P)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.unbind("ref"),this.bindings.ref=b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new C(this),this.bindings=this.bindings||{},this.bindings.iterator=this.iterator_),this.iterator_.updateDependencies(a,this.model_),M&&M.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0,this.bindings.iterator=void 0))},createInstance:function(a,b,c,d){b&&(c=this.newDelegate_(b)),this.refContent_||(this.refContent_=this.ref_.content);var e=this.refContent_,f=this.bindingMap_;f&&f.content===e||(f=B(e,c&&c.prepareBinding)||[],f.content=e,this.bindingMap_=f);var g=m(this),h=g.createDocumentFragment();h.templateCreator_=this,h.protoContent_=e;for(var i={firstNode:null,lastNode:null,model:a},j=0,k=e.firstChild;k;k=k.nextSibling){var l=A(k,h,g,f.children[j++],a,c,d);l.templateInstance_=i}return i.firstNode=h.firstChild,i.lastNode=h.lastChild,h.templateCreator_=void 0,h.protoContent_=void 0,h},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_=void 0,this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}return a?{raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}:{}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}}),Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}}),C.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(H,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(G,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(F,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getTerminatorAt:function(a){if(-1==a)return this.templateElement_;var b=this.terminators[2*a];if(b.nodeType!==Node.ELEMENT_NODE||this.templateElement_===b)return b;var c=b.iterator_;return c?c.getTerminatorAt(c.terminators.length/2-1):b},insertInstanceAt:function(a,b,c,d){var e=this.getTerminatorAt(a-1),f=e;b?f=b.lastChild||f:c&&(f=c[c.length-1]||f),this.terminators.splice(2*a,0,f,d);var g=this.templateElement_.parentNode,h=e.nextSibling;if(b)g.insertBefore(b,h);else if(c)for(var i=0;i<c.length;i++)g.insertBefore(c[i],h)},extractInstanceAt:function(a){var b=[],c=this.getTerminatorAt(a-1),d=this.getTerminatorAt(a);b.instanceBindings=this.terminators[2*a+1],this.terminators.splice(2*a,2);for(var e=this.templateElement_.parentNode;d!==c;){var f=c.nextSibling;f==d&&(d=c),e.removeChild(f),b.push(f)}return b},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));var d=new D,e=0;a.forEach(function(a){a.removed.forEach(function(b){var c=this.extractInstanceAt(a.index+e);d.set(b,c)},this),e-=a.addedCount},this),a.forEach(function(a){for(var e=a.index;e<a.index+a.addedCount;e++){var f,g=this.iteratedValue[e],h=void 0,i=d.get(g);i?(d.delete(g),f=i.instanceBindings):(f=[],this.instanceModelFn_&&(g=this.instanceModelFn_(g)),void 0!==g&&(h=b.createInstance(g,void 0,c,f))),this.insertInstanceAt(e,h,i,f)}},this),d.forEach(function(a){this.closeInstanceBindings(a.instanceBindings)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.getTerminatorAt(a-1),c=this.getTerminatorAt(a);if(b!==c){var d=b.nextSibling.templateInstance;this.instancePositionChangedFn_(d,a)}},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.terminators.length/2;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=0;b<a.length;b++)a[b].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=1;a<this.terminators.length;a+=2)this.closeInstanceBindings(this.terminators[a]);this.terminators.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&" ᠎              ".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b;for(a=C();v(".")||v("[");)v("[")?(b=G(),a=Z.createMemberExpression("[",a,b)):(b=F(),a=Z.createMemberExpression(".",a,b));return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=s[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),s[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.dynamicDeps="function"==typeof a||a.dynamic,this.dynamic="function"==typeof b||b.dynamic||"["==c,this.simplePath=!this.dynamic&&!this.dynamicDeps&&b instanceof e&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property="."==c?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a){return"o"===a[0]&&"n"===a[1]&&"-"===a[2]}function o(a,b){for(;a[w]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[w];return a}function p(a,b){if(0==b.length)return void 0;if(1==b.length)return o(a,b[0]);for(var c=0;null!=a&&c<b.length-1;c++)a=a[b[c]];return a}function q(a,b,c){var d=b.substring(3);return d=v[d]||d,function(b,e,f){function g(){return"{{ "+a+" }}"}var h,i,j;return j="function"==typeof c.resolveEventHandler?function(d){h=h||c.resolveEventHandler(b,a,e),h(d,d.detail,d.currentTarget),Platform&&"function"==typeof Platform.flush&&Platform.flush()}:function(c){h=h||a.getValueFrom(b),i=i||p(b,a,e),h.apply(i,[c,c.detail,c.currentTarget]),Platform&&"function"==typeof Platform.flush&&Platform.flush()},e.addEventListener(d,j),f?void 0:{open:g,discardChanges:g,close:function(){e.removeEventListener(d,j)}}}}function r(){}var s=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=o(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof e?this.object.name:this.object.fullPath;this.fullPath_=Path.get(a+"."+this.property.name)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.property instanceof e){var b=Path.get(this.property.name);this.valueFn_=function(c,d){var e=a(c,d);return d&&d.addPath(e,b),b.getValueFrom(e)}}else{var c=this.property;this.valueFn_=function(b,d){var e=a(b,d),f=c(b,d);return d&&d.addPath(e,f),e?e[f]:void 0}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=d;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find filter: "+this.name);if(b?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("No "+(b?"toModel":"toDOM")+" found on"+this.name);for(var h=[a],j=0;j<this.args.length;j++)h[j+1]=i(this.args[j])(d,e);return f.apply(g,h)}};var t={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},u={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!t[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return t[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!u[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return u[a](b(d,e),c(d,e))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e){return a(d,e)?b(d,e):c(d,e)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c){for(var d={},e=0;e<a.length;e++)d[a[e].key]=a[e].value(b,c);return d}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){g.dynamicDeps&&f.startReset();var c=g.getValue(a,g.dynamicDeps?f:void 0,b);return g.dynamicDeps&&f.finishReset(),c}function e(c){return g.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver;this.getValue(a,f,b);var g=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b),e=0;e<this.filters.length;e++)d=this.filters[e].transform(d,!1,c,a,b);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(b,!0,c,a);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var v={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){v[a.toLowerCase()]=a});var w="@"+Math.random().toString(36).slice(2);r.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);if(n(c))return e.valid?q(e,c,this):void console.error("on-* bindings must be simple path expressions");{if(!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=o(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){var e=Object.create(c);return e[b]=a,e[d]=void 0,e[w]=c,e}}}},a.PolymerExpressions=r,a.exposeGetExpression&&(a.getExpression_=c),a.PolymerExpressions.prepareEventBinding=q}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e,f=125;if(window.addEventListener("WebComponentsReady",function(){b(),Observer.hasObjectObserve||(a.flushPoll=setInterval(b,f))}),window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index 72c2ebb..a60f0d9 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["../PointerGestures/src/PointerGestureEvent.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../PointerEvents/src/boot.js","../PointerEvents/src/touch-action.js","../PointerEvents/src/PointerEvent.js","../PointerEvents/src/pointermap.js","../PointerEvents/src/dispatcher.js","../PointerEvents/src/installer.js","../PointerEvents/src/mouse.js","../PointerEvents/src/touch.js","../PointerEvents/src/ms.js","../PointerEvents/src/platform-events.js","../PointerEvents/src/capture.js","../PointerGestures/src/initialize.js","../PointerGestures/src/pointermap.js","../PointerGestures/src/dispatcher.js","../PointerGestures/src/hold.js","../PointerGestures/src/track.js","../PointerGestures/src/flick.js","../PointerGestures/src/pinch.js","../PointerGestures/src/tap.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\n};\n\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var PROP_ADD_TYPE = 'add';\n  var PROP_UPDATE_TYPE = 'update';\n  var PROP_RECONFIGURE_TYPE = 'reconfigure';\n  var PROP_DELETE_TYPE = 'delete';\n  var ARRAY_SPLICE_TYPE = 'splice';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    Object.observe(test, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 3)\n      return false;\n\n    // TODO(rafaelw): Remove this when new change record type names make it to\n    // chrome release.\n    if (records[0].type == 'new' &&\n        records[1].type == 'updated' &&\n        records[2].type == 'deleted') {\n      PROP_ADD_TYPE = 'new';\n      PROP_UPDATE_TYPE = 'updated';\n      PROP_RECONFIGURE_TYPE = 'reconfigured';\n      PROP_DELETE_TYPE = 'deleted';\n    } else if (records[0].type != 'add' ||\n               records[1].type != 'update' ||\n               records[2].type != 'delete') {\n      console.error('Unexpected change record names for Object.observe. ' +\n                    'Using dirty-checking instead');\n      return false;\n    }\n    Object.unobserve(test, callback);\n\n    test = [0];\n    Array.observe(test, callback);\n    test[1] = 1;\n    test.length = 0;\n    Object.deliverChangeRecords(callback);\n    if (records.length != 2)\n      return false;\n    if (records[0].type != ARRAY_SPLICE_TYPE ||\n        records[1].type != ARRAY_SPLICE_TYPE) {\n      return false;\n    }\n    Array.unobserve(test, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // don't test for eval if document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!obj)\n          return;\n        observe(obj);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!isObject(obj))\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(reset);\n    }\n\n    function callback() {\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n\n      scheduleReset();\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        observedSetCache.push(this);\n      },\n      reset: scheduleReset\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = typeof Object.deliverAllChangeRecords == 'function';\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      Object.deliverAllChangeRecords();\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = path instanceof Path ? path : getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver() {\n    Observer.call(this);\n\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\n      var object;\n      var needsDirectObserver = false;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel) {\n          needsDirectObserver = true;\n          break;\n        }\n      }\n\n      if (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n\n      this.closeObservers_();\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.closeObservers_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {};\n  expectedRecordTypes[PROP_ADD_TYPE] = true;\n  expectedRecordTypes[PROP_UPDATE_TYPE] = true;\n  expectedRecordTypes[PROP_DELETE_TYPE] = true;\n\n  function notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify(PROP_UPDATE_TYPE, oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == PROP_UPDATE_TYPE)\n        continue;\n\n      if (record.type == PROP_ADD_TYPE) {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case ARRAY_SPLICE_TYPE:\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case PROP_ADD_TYPE:\n        case PROP_UPDATE_TYPE:\n        case PROP_DELETE_TYPE:\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n\n  // TODO(rafaelw): Only needed for testing until new change record names\n  // make it to release.\n  global.Observer.changeRecordTypes = {\n    add: PROP_ADD_TYPE,\n    update: PROP_UPDATE_TYPE,\n    reconfigure: PROP_RECONFIGURE_TYPE,\n    'delete': PROP_DELETE_TYPE,\n    splice: ARRAY_SPLICE_TYPE\n  };\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript || document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = (flags.shadow || flags.shadowdom || flags.polyfill);\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\n// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    GeneratedWrapper.prototype =\n        Object.create(superWrapperConstructor.prototype);\n    GeneratedWrapper.prototype.constructor = GeneratedWrapper;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function rootOfNode(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n    return node;\n  }\n\n  function inSameTree(a, b) {\n    return rootOfNode(a) === rootOfNode(b);\n  }\n\n  function enclosedBy(a, b) {\n    if (a === b)\n      return true;\n    if (a instanceof wrappers.ShadowRoot)\n      return enclosedBy(rootOfNode(a.host), b);\n    return false;\n  }\n\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n\n    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window load events the load event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (event.type === 'load' &&\n        eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (originalEvent.relatedTarget) {\n        var relatedTarget = wrap(originalEvent.relatedTarget);\n\n        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n        if (adjusted === target)\n          return true;\n\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent)\n      this.impl = type;\n    else\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = rootOfNode(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = rootOfNode(currentTarget);\n          if (enclosedBy(baseRoot, currentRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      return relatedTargetTable.get(this) || wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.adjustRelatedTarget = adjustRelatedTarget;\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node) {\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i]);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    // Nothing at this point in time.\n  }\n\n  function nodesWereRemoved(nodes) {\n    // Nothing at this point in time.\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      if (!child)\n        return false;\n\n      child = wrapIfNeeded(child);\n\n      // TODO(arv): Optimize using ownerDocument etc.\n      if (child === this)\n        return true;\n      var parentNode = child.parentNode;\n      if (!parentNode)\n        return false;\n      return this.contains(parentNode);\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl, unwrap(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n  scope.cloneNode = cloneNode;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      pendingDirtyRenderers[i].render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    for (; node; node = node.parentNode) {\n      if (node instanceof ShadowRoot)\n        return node;\n    }\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        // renderNode.skip = !renderer.dirty;\n        renderer.invalidate();\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype = object.prototype;\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (object.extends)\n        p.extends = object.extends;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (object.extends) {\n            return document.createElement(object.extends, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n  });\n\n  registerWrapper(OriginalWindow, Window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n})();\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :ancestor: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName, ownSheet) {\n    var typeExtension = this.isTypeExtension(extendsName);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var def = this.registerDefinition(root, name, extendsName);\n    // find styles and apply shimming...\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    var cssText = this.stylesToShimmedCssText(def.rootStyles, def.scopeStyles,\n        name, typeExtension);\n    // provide shimmedStyle for user extensibility\n    def.shimmedStyle = cssTextToStyle(cssText);\n    if (root) {\n      root.shimmedStyle = def.shimmedStyle;\n    }\n    // remove existing style elements\n    for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]); \n        i++) {\n      s.parentNode.removeChild(s);\n    }\n    // add style to document\n    if (ownSheet) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  },\n  // apply @polyfill rules + :host and scope shimming\n  stylesToShimmedCssText: function(rootStyles, scopeStyles, name,\n      typeExtension) {\n    name = name || '';\n    // insert @polyfill and @polyfill-rule rules into style elements\n    // scoping process takes care of shimming these\n    this.insertPolyfillDirectives(rootStyles);\n    this.insertPolyfillRules(rootStyles);\n    var cssText = this.shimScoping(scopeStyles, name, typeExtension);\n    // note: we only need to do rootStyles since these are unscoped.\n    cssText += this.extractPolyfillUnscopedRules(rootStyles);\n    return cssText.trim();\n  },\n  registerDefinition: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = root ? root.querySelectorAll('style') : [];\n    styles = styles ? Array.prototype.slice.call(styles, 0) : [];\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee && (!root || root.querySelector('shadow'))) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with comments.\n   * \n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill :host menu-item (comment end)\n   * shadow::-webkit-distributed(menu-item) {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectives: function(styles) {\n    if (styles) {\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = this.insertPolyfillDirectivesInCssText(s.textContent);\n      }, this);\n    }\n  },\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    return cssText.replace(cssPolyfillCommentRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-rule :host menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRules: function(styles) {\n    if (styles) {\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = this.insertPolyfillRulesInCssText(s.textContent);\n      }, this);\n    }\n  },\n  insertPolyfillRulesInCssText: function(cssText) {\n    return cssText.replace(cssPolyfillRuleCommentRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractPolyfillUnscopedRules: function(styles) {\n    var cssText = '';\n    if (styles) {\n      Array.prototype.forEach.call(styles, function(s) {\n        cssText += this.extractPolyfillUnscopedRulesFromCssText(\n            s.textContent) + '\\n\\n';\n      }, this);\n    }\n    return cssText;\n  },\n  extractPolyfillUnscopedRulesFromCssText: function(cssText) {\n    var r = '', matches;\n    while (matches = cssPolyfillUnscopedRuleCommentRe.exec(cssText)) {\n      r += matches[1].slice(0, -1) + '\\n\\n';\n    }\n    return r;\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  shimScoping: function(styles, name, typeExtension) {\n    if (styles) {\n      return this.convertScopedStyles(styles, name, typeExtension);\n    }\n  },\n  convertScopedStyles: function(styles, name, typeExtension) {\n    var cssText = stylesToCssText(styles);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonAncestor(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (name) {\n      var self = this, cssText;\n      \n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, name, typeExtension);\n      });\n\n    }\n    return cssText;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :ancestor(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :ancestor(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonAncestor: function(cssText) {\n    return this.convertColonRule(cssText, cssColonAncestorRe,\n        this.colonAncestorPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonAncestorPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    return cssText.replace(/\\^\\^/g, ' ').replace(/\\^/g, ' ');\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, name, typeExtension) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, name, typeExtension, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, name, typeExtension);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, name, typeExtension, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, name, typeExtension)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, name) :\n            this.applySimpleSelectorScope(p, name, typeExtension);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, name, typeExtension) {\n    var re = this.makeScopeMatcher(name, typeExtension);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(name, typeExtension) {\n    var matchScope = typeExtension ? '\\\\[is=[\\'\"]?' + name + '[\\'\"]?\\\\]' : name;\n    return new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, name, typeExtension) {\n    var scoper = typeExtension ? '[is=' + name + ']' : name;\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scoper);\n      return selector.replace(polyfillHostRe, scoper + ' ');\n    } else {\n      return scoper + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, name) {\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + name + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(hostRe, polyfillHost).replace(colonHostRe,\n        polyfillHost).replace(colonAncestorRe, polyfillAncestor);\n  },\n  propertiesFromRule: function(rule) {\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    if (rule.style.content && !rule.style.content.match(/['\"]+/)) {\n      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    return rule.style.cssText;\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    cssPolyfillCommentRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssPolyfillRuleCommentRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssPolyfillUnscopedRuleCommentRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :ancestor pre-processed to -shadowcssancestor.\n    polyfillAncestor = '-shadowcssancestor',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    hostRe = /@host/gim,\n    colonHostRe = /\\:host/gim,\n    colonAncestorRe = /\\:ancestor/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim');\n    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        var styles = [style];\n        style.textContent = ShadowCSS.stylesToShimmedCssText(styles, styles);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  var originalCreateShadowRoot = Element.prototype.webkitCreateShadowRoot;\n  Element.prototype.webkitCreateShadowRoot = function() {\n    var elderRoot = this.webkitShadowRoot;\n    var root = originalCreateShadowRoot.call(this);\n    root.olderShadowRoot = elderRoot;\n    root.host = this;\n    CustomElements.watchShadow(this);\n    return root;\n  }\n\n  Object.defineProperties(Element.prototype, {\n    shadowRoot: {\n      get: function() {\n        return this.webkitShadowRoot;\n      }\n    },\n    createShadowRoot: {\n      value: function() {\n        return this.webkitCreateShadowRoot();\n      }\n    }\n  });\n\n  window.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})();","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\n};","(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  scope.module = module;\n  scope.using = using;\n\n})(window);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      if (attr && attr.value &&\n         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {\n        var urlPath = resolveRelativeUrl(url, attr.value);\n        attr.value = urlPath;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = document.baseURI;\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/');\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      var receiveXhr = function(err, resource) {\n        this.receive(url, elt, err, resource);\n      }.bind(this);\n      xhr.load(url, receiveXhr);\n      // TODO(sorvell): blocked on\n      // https://code.google.com/p/chromium/issues/detail?id=257221\n      // xhr'ing for a document makes scripts in imports runnable; otherwise\n      // they are not; however, it requires that we have doctype=html in\n      // the import which is unacceptable. This is only needed on Chrome\n      // to avoid the bug above.\n      /*\n      if (isDocumentLink(elt)) {\n        xhr.loadDocument(url, receiveXhr);\n      } else {\n        xhr.load(url, receiveXhr);\n      }\n      */\n    },\n    receive: function(url, elt, err, resource) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(callback);\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) :\n      link.__importParsed;\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        nativePrototype = Object.getPrototypeOf(inst);\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  scope = scope || {};\n  scope.external = scope.external || {};\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    }\n  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n  function shadowSelector(v) {\n    return 'body ^^ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; touch-action-delay: none; }';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    }\n  ];\n  var styles = '';\n  attrib2css.forEach(function(r) {\n    if (String(r) === r) {\n      styles += selector(r) + rule(r) + '\\n';\n      styles += shadowSelector(r) + rule(r) + '\\n';\n    } else {\n      styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n      styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n    }\n  });\n  var el = document.createElement('style');\n  el.textContent = styles;\n  document.head.appendChild(el);\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n  // test for DOM Level 4 Events\n  var NEW_MOUSE_EVENT = false;\n  var HAS_BUTTONS = false;\n  try {\n    var ev = new MouseEvent('click', {buttons: 1});\n    NEW_MOUSE_EVENT = true;\n    HAS_BUTTONS = ev.buttons === 1;\n  } catch(e) {\n  }\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null\n  ];\n\n  function PointerEvent(inType, inDict) {\n    inDict = inDict || {};\n    // According to the w3c spec,\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button\n    // MouseEvent.button == 0 can mean either no mouse button depressed, or the\n    // left mouse button depressed.\n    //\n    // As of now, the only way to distinguish between the two states of\n    // MouseEvent.button is by using the deprecated MouseEvent.which property, as\n    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that\n    // no mouse button is held.\n    //\n    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,\n    // but initMouseEvent does not expose an argument with which to set\n    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set\n    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations\n    // of app developers.\n    //\n    // The only way to propagate the correct state of MouseEvent.which and\n    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0\n    // is to call initMouseEvent with a buttonArg value of -1.\n    //\n    // This is fixed with DOM Level 4's use of buttons\n    var buttons;\n    if (inDict.buttons || HAS_BUTTONS) {\n      buttons = inDict.buttons;\n    } else {\n      switch (inDict.which) {\n        case 1: buttons = 1; break;\n        case 2: buttons = 4; break;\n        case 3: buttons = 2; break;\n        default: buttons = 0;\n      }\n    }\n\n    var e;\n    if (NEW_MOUSE_EVENT) {\n      e = new MouseEvent(inType, inDict);\n    } else {\n      e = document.createEvent('MouseEvent');\n\n      // import values from the given dictionary\n      var props = {}, p;\n      for(var i = 0; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        props[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n\n      // define the properties inherited from MouseEvent\n      e.initMouseEvent(\n        inType, props.bubbles, props.cancelable, props.view, props.detail,\n        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,\n        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget\n      );\n    }\n\n    // make the event pass instanceof checks\n    e.__proto__ = PointerEvent.prototype;\n\n    // define the buttons property according to DOM Level 3 spec\n    if (!HAS_BUTTONS) {\n      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting\n      // mechanism\n      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});\n    }\n\n    // Spec requires that pointers without pressure specified use 0.5 for down\n    // state and 0 for up state.\n    var pressure = 0;\n    if (inDict.pressure) {\n      pressure = inDict.pressure;\n    } else {\n      pressure = buttons ? 0.5 : 0;\n    }\n\n    // define the properties of the PointerEvent interface\n    Object.defineProperties(e, {\n      pointerId: { value: inDict.pointerId || 0, enumerable: true },\n      width: { value: inDict.width || 0, enumerable: true },\n      height: { value: inDict.height || 0, enumerable: true },\n      pressure: { value: pressure, enumerable: true },\n      tiltX: { value: inDict.tiltX || 0, enumerable: true },\n      tiltY: { value: inDict.tiltY || 0, enumerable: true },\n      pointerType: { value: inDict.pointerType || '', enumerable: true },\n      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },\n      isPrimary: { value: inDict.isPrimary || false, enumerable: true }\n    });\n    return e;\n  }\n\n  // PointerEvent extends MouseEvent\n  PointerEvent.prototype = Object.create(MouseEvent.prototype);\n\n  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    targets: new WeakMap(),\n    handledEvents: new WeakMap(),\n    pointermap: new scope.PointerMap(),\n    eventMap: {},\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: {},\n    eventSourceList: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.removeEvent || function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\n      this.targets.set(e, this.targets.get(inEvent) || inEvent.target);\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      if (this.captureInfo) {\n        if (this.captureInfo.id === inEvent.pointerId) {\n          return this.captureInfo.target;\n        }\n      }\n      return this.targets.get(inEvent);\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo) {\n        this.releaseCapture(this.captureInfo.id);\n      }\n      this.captureInfo = {id: inPointerId, target: inTarget};\n      var e = new PointerEvent('gotpointercapture', { bubbles: true });\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      this.targets.set(e, inTarget);\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      if (this.captureInfo && this.captureInfo.id === inPointerId) {\n        var e = new PointerEvent('lostpointercapture', { bubbles: true });\n        var t = this.captureInfo.target;\n        this.captureInfo = null;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        this.targets.set(e, t);\n        this.asyncDispatchEvent(e);\n      }\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      setTimeout(this.dispatchEvent.bind(this, inEvent), 0);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('DOMContentLoaded', this.installNewSubtree.bind(this, document));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup',\n      'mouseover',\n      'mouseout'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var findTarget = scope.findTarget;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = false;\n  \n  // handler block for native touch events\n  var touchEvents = {\n    scrollType: new WeakMap(),\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        this.scrollType.set(el, st);\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      this.scrollType['delete'](el);\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        this.scrollType['delete'](s);\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        this.scrollType.set(el, st);\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    touchToPointer: function(inTouch) {\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      e.pointerId = inTouch.identifier + 2;\n      e.target = findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\n      e.buttons = 1;\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      var pointers = touchMap(tl, this.touchToPointer, this);\n      // forward touch preventDefaults\n      pointers.forEach(function(p) {\n        p.preventDefault = function() {\n          this.scrolling = false;\n          this.firstXY = null;\n          inEvent.preventDefault();\n        };\n      }, this);\n      pointers.forEach(inFunction, this);\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = this.scrollType.get(inEvent.currentTarget);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(this.touchToPointer(p));\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (!this.scrolling) {\n        if (this.shouldScroll(inEvent)) {\n          this.scrolling = true;\n          this.touchcancel(inEvent);\n        } else {\n          inEvent.preventDefault();\n          this.processTouches(inEvent, this.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  // only activate if this platform does not have pointer events\n  if (window.navigator.pointerEnabled === undefined) {\n    Object.defineProperty(window.navigator, 'pointerEnabled', {value: true, enumerable: true});\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\n      dispatcher.registerSource('ms', scope.msEvents);\n    } else {\n      dispatcher.registerSource('mouse', scope.mouseEvents);\n      if (window.ontouchstart !== undefined) {\n        dispatcher.registerSource('touch', scope.touchEvents);\n      }\n    }\n\n    dispatcher.register(document);\n  }\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  /**\n   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\n        }\n        var adepth = this.depth(a);\n        var bdepth = this.depth(b);\n        var d = adepth - bdepth;\n        if (d > 0) {\n          a = this.walk(a, d);\n        } else {\n          b = this.walk(b, -d);\n        }\n        while(a && b && a !== b) {\n          a = this.walk(a, 1);\n          b = this.walk(b, 1);\n        }\n        return a;\n      },\n      walk: function(n, u) {\n        for (var i = 0; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0\n  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      var fn = function() {\n        this.dispatchEvent(inEvent, inTarget);\n      }.bind(this);\n      setTimeout(fn, 0);\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  var registerQueue = [];\n  var immediateRegister = false;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      registerQueue.push(inScope);\n    }\n  };\n  // wait to register scopes until recognizers load\n  document.addEventListener('DOMContentLoaded', function() {\n    immediateRegister = true;\n    registerQueue.push(document);\n    registerQueue.forEach(scope.register);\n  });\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     pointermove: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n       }\n     },\n     pointerup: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     },\n     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      var points = {};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e) {\n      if (!e.tapPrevented) {\n        // only allow left click to tap for mouse\n        return e.pointerType === 'mouse' ? e.buttons === 1 : true;\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\n","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  function unbind(node, name) {\n    var bindings = node.bindings;\n    if (!bindings) {\n      node.bindings = {};\n      return;\n    }\n\n    var binding = bindings[name];\n    if (!binding)\n      return;\n\n    binding.close();\n    bindings[name] = undefined;\n  }\n\n  Node.prototype.unbind = function(name) {\n    unbind(this, name);\n  };\n\n  Node.prototype.unbindAll = function() {\n    if (!this.bindings)\n      return;\n    var names = Object.keys(this.bindings);\n    for (var i = 0; i < names.length; i++) {\n      var binding = this.bindings[names[i]];\n      if (binding)\n        binding.close();\n    }\n\n    this.bindings = {};\n  };\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    unbind(this, 'textContent');\n    updateText(this, value.open(textBinding(this)));\n    return this.bindings.textContent = value;\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n    unbind(this, name);\n    updateAttribute(this, name, conditional,\n        value.open(attributeBinding(this, name, conditional)));\n\n    return this.bindings[name] = value;\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    var capturedClose = observable.close;\n    observable.close = function() {\n      if (!capturedClose)\n        return;\n      input.removeEventListener(eventType, eventHandler);\n\n      observable.close = capturedClose;\n      observable.close();\n      capturedClose = undefined;\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value, postEventFn);\n    updateInput(this, name,\n                value.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    return this.bindings[name] = value;\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateInput(this, 'value',\n                value.open(inputBinding(this, 'value', sanitizeValue)));\n\n    return this.bindings.value = value;\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings &&\n        parentNode.bindings.value) {\n      select = parentNode;\n      selectBinding = select.bindings.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.setValue(select.value);\n      selectBinding.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateOption(this, value.open(optionBinding(this)));\n    return this.bindings.value = value;\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value);\n    updateInput(this, name,\n                value.open(inputBinding(this, name)));\n    return this.bindings[name] = value;\n  }\n})(this);\n","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      this.unbind('ref');\n      return this.bindings.ref = value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n          this.bindings.iterator = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n        this.bindings = this.bindings || {};\n        this.bindings.iterator = this.iterator_;\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_,\n                             instanceBindings_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      var map = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n\n      var instanceRecord = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instanceBindings_);\n        clone.templateInstance_ = instanceRecord;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      this.bindings_ = undefined;\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return {};\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      tokens.push(Path.get(pathString)); // PATH\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n\n    // Flattened array of tuples:\n    //   <instanceTerminatorNode, [bindingsSetupByInstance]>\n    this.terminators = [];\n\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getTerminatorAt: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var terminator = this.terminators[index*2];\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subIterator = terminator.iterator_;\n      if (!subIterator)\n        return terminator;\n\n      return subIterator.getTerminatorAt(subIterator.terminators.length/2 - 1);\n    },\n\n    // TODO(rafaelw): If we inserting sequences of instances we can probably\n    // avoid lots of calls to getTerminatorAt(), or cache its result.\n    insertInstanceAt: function(index, fragment, instanceNodes,\n                               instanceBindings) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = previousTerminator;\n      if (fragment)\n        terminator = fragment.lastChild || terminator;\n      else if (instanceNodes)\n        terminator = instanceNodes[instanceNodes.length - 1] || terminator;\n\n      this.terminators.splice(index*2, 0, terminator, instanceBindings);\n      var parent = this.templateElement_.parentNode;\n      var insertBeforeNode = previousTerminator.nextSibling;\n\n      if (fragment) {\n        parent.insertBefore(fragment, insertBeforeNode);\n      } else if (instanceNodes) {\n        for (var i = 0; i < instanceNodes.length; i++)\n          parent.insertBefore(instanceNodes[i], insertBeforeNode);\n      }\n    },\n\n    extractInstanceAt: function(index) {\n      var instanceNodes = [];\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      instanceNodes.instanceBindings = this.terminators[index*2 + 1];\n      this.terminators.splice(index*2, 2);\n\n      var parent = this.templateElement_.parentNode;\n      while (terminator !== previousTerminator) {\n        var node = previousTerminator.nextSibling;\n        if (node == terminator)\n          terminator = previousTerminator;\n\n        parent.removeChild(node);\n        instanceNodes.push(node);\n      }\n\n      return instanceNodes;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      splices.forEach(function(splice) {\n        splice.removed.forEach(function(model) {\n          var instanceNodes =\n              this.extractInstanceAt(splice.index + removeDelta);\n          instanceCache.set(model, instanceNodes);\n        }, this);\n\n        removeDelta -= splice.addedCount;\n      }, this);\n\n      splices.forEach(function(splice) {\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var fragment = undefined;\n          var instanceNodes = instanceCache.get(model);\n          var instanceBindings;\n          if (instanceNodes) {\n            instanceCache.delete(model);\n            instanceBindings = instanceNodes.instanceBindings;\n          } else {\n            instanceBindings = [];\n            if (this.instanceModelFn_)\n              model = this.instanceModelFn_(model);\n\n            if (model !== undefined) {\n              fragment = template.createInstance(model, undefined, delegate,\n                                                 instanceBindings);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, fragment, instanceNodes,\n                                instanceBindings);\n        }\n      }, this);\n\n      instanceCache.forEach(function(instanceNodes) {\n        this.closeInstanceBindings(instanceNodes.instanceBindings);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      if (previousTerminator === terminator)\n        return; // instance has zero nodes.\n\n      // We must use the first node of the instance, because any subsequent\n      // nodes may have been generated by sub-templates.\n      // TODO(rafaelw): This is brittle WRT instance mutation -- e.g. if the\n      // first node was removed by script.\n      var templateInstance = previousTerminator.nextSibling.templateInstance;\n      this.instancePositionChangedFn_(templateInstance, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.terminators.length / 2;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instanceBindings) {\n      for (var i = 0; i < instanceBindings.length; i++) {\n        instanceBindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 1; i < this.terminators.length; i += 2) {\n        this.closeInstanceBindings(this.terminators[i]);\n      }\n\n      this.terminators.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright 2013 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function (global) {\n  'use strict';\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (this.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\n            if (observer)\n              observer.addPath(context, propName);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(value, toModelDirection, filterRegistry, model,\n                        observer) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer) {\n        return unaryOperators[op](argument(model, observer));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      this.getValue(model, observer, filterRegistry);  // captures deps.\n      var self = this;\n\n      function valueFn() {\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(newValue, true, filterRegistry,\n                                                 model);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\n  }\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\n\n      if (path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          }\n        }\n\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\nvar FLUSH_POLL_INTERVAL = 125;\nwindow.addEventListener('WebComponentsReady', function() {\n  flush();\n  // flush periodically if platform does not have object observe.\n  if (!Observer.hasObjectObserve) {\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  }\n});\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["../PointerGestures/src/PointerGestureEvent.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../PointerEvents/src/boot.js","../PointerEvents/src/touch-action.js","../PointerEvents/src/PointerEvent.js","../PointerEvents/src/pointermap.js","../PointerEvents/src/dispatcher.js","../PointerEvents/src/installer.js","../PointerEvents/src/mouse.js","../PointerEvents/src/touch.js","../PointerEvents/src/ms.js","../PointerEvents/src/platform-events.js","../PointerEvents/src/capture.js","../PointerGestures/src/initialize.js","../PointerGestures/src/pointermap.js","../PointerGestures/src/dispatcher.js","../PointerGestures/src/hold.js","../PointerGestures/src/track.js","../PointerGestures/src/flick.js","../PointerGestures/src/pinch.js","../PointerGestures/src/tap.js","../PointerGestures/src/registerScopes.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\n};\n\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var PROP_ADD_TYPE = 'add';\n  var PROP_UPDATE_TYPE = 'update';\n  var PROP_RECONFIGURE_TYPE = 'reconfigure';\n  var PROP_DELETE_TYPE = 'delete';\n  var ARRAY_SPLICE_TYPE = 'splice';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    Object.observe(test, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 3)\n      return false;\n\n    // TODO(rafaelw): Remove this when new change record type names make it to\n    // chrome release.\n    if (records[0].type == 'new' &&\n        records[1].type == 'updated' &&\n        records[2].type == 'deleted') {\n      PROP_ADD_TYPE = 'new';\n      PROP_UPDATE_TYPE = 'updated';\n      PROP_RECONFIGURE_TYPE = 'reconfigured';\n      PROP_DELETE_TYPE = 'deleted';\n    } else if (records[0].type != 'add' ||\n               records[1].type != 'update' ||\n               records[2].type != 'delete') {\n      console.error('Unexpected change record names for Object.observe. ' +\n                    'Using dirty-checking instead');\n      return false;\n    }\n    Object.unobserve(test, callback);\n\n    test = [0];\n    Array.observe(test, callback);\n    test[1] = 1;\n    test.length = 0;\n    Object.deliverChangeRecords(callback);\n    if (records.length != 2)\n      return false;\n    if (records[0].type != ARRAY_SPLICE_TYPE ||\n        records[1].type != ARRAY_SPLICE_TYPE) {\n      return false;\n    }\n    Array.unobserve(test, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // don't test for eval if document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!obj)\n          return;\n        observe(obj);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!isObject(obj))\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduledReset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      reset();\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(scheduledReset);\n    }\n\n    function callback() {\n      reset();\n\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        observedSetCache.push(this);\n      },\n      reset: scheduleReset\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = typeof Object.deliverAllChangeRecords == 'function';\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      Object.deliverAllChangeRecords();\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = path instanceof Path ? path : getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver() {\n    Observer.call(this);\n\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\n      var object;\n      var needsDirectObserver = false;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel) {\n          needsDirectObserver = true;\n          break;\n        }\n      }\n\n      if (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n\n      this.closeObservers_();\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.closeObservers_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {};\n  expectedRecordTypes[PROP_ADD_TYPE] = true;\n  expectedRecordTypes[PROP_UPDATE_TYPE] = true;\n  expectedRecordTypes[PROP_DELETE_TYPE] = true;\n\n  function notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify(PROP_UPDATE_TYPE, oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == PROP_UPDATE_TYPE)\n        continue;\n\n      if (record.type == PROP_ADD_TYPE) {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case ARRAY_SPLICE_TYPE:\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case PROP_ADD_TYPE:\n        case PROP_UPDATE_TYPE:\n        case PROP_DELETE_TYPE:\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n\n  // TODO(rafaelw): Only needed for testing until new change record names\n  // make it to release.\n  global.Observer.changeRecordTypes = {\n    add: PROP_ADD_TYPE,\n    update: PROP_UPDATE_TYPE,\n    reconfigure: PROP_RECONFIGURE_TYPE,\n    'delete': PROP_DELETE_TYPE,\n    splice: ARRAY_SPLICE_TYPE\n  };\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript || document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = (flags.shadow || flags.shadowdom || flags.polyfill);\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\n// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n\n    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window load events the load event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (event.type === 'load' &&\n        eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (originalEvent.relatedTarget) {\n        var relatedTarget = wrap(originalEvent.relatedTarget);\n\n        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n        if (adjusted === target)\n          return true;\n\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent)\n      this.impl = type;\n    else\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      return relatedTargetTable.get(this) || wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.adjustRelatedTarget = adjustRelatedTarget;\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl, unwrap(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype = object.prototype;\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (object.extends)\n        p.extends = object.extends;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (object.extends) {\n            return document.createElement(object.extends, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n  });\n\n  registerWrapper(OriginalWindow, Window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n})();\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :ancestor: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee && (!root || root.querySelector('shadow'))) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonAncestor(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :ancestor(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :ancestor(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonAncestor: function(cssText) {\n    return this.convertColonRule(cssText, cssColonAncestorRe,\n        this.colonAncestorPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonAncestorPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    return cssText.replace(/\\^\\^/g, ' ').replace(/\\^/g, ' ');\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySimpleSelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(hostRe, polyfillHost).replace(colonHostRe,\n        polyfillHost).replace(colonAncestorRe, polyfillAncestor);\n  },\n  propertiesFromRule: function(rule) {\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    if (rule.style.content && !rule.style.content.match(/['\"]+/)) {\n      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    return rule.style.cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :ancestor pre-processed to -shadowcssancestor.\n    polyfillAncestor = '-shadowcssancestor',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    hostRe = /@host/gim,\n    colonHostRe = /\\:host/gim,\n    colonAncestorRe = /\\:ancestor/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  var originalCreateShadowRoot = Element.prototype.webkitCreateShadowRoot;\n  Element.prototype.webkitCreateShadowRoot = function() {\n    var elderRoot = this.webkitShadowRoot;\n    var root = originalCreateShadowRoot.call(this);\n    root.olderShadowRoot = elderRoot;\n    root.host = this;\n    CustomElements.watchShadow(this);\n    return root;\n  }\n\n  Object.defineProperties(Element.prototype, {\n    shadowRoot: {\n      get: function() {\n        return this.webkitShadowRoot;\n      }\n    },\n    createShadowRoot: {\n      value: function() {\n        return this.webkitCreateShadowRoot();\n      }\n    }\n  });\n\n  window.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})();","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\n};","(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  scope.module = module;\n  scope.using = using;\n\n})(window);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      if (attr && attr.value &&\n         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {\n        var urlPath = resolveRelativeUrl(url, attr.value);\n        attr.value = urlPath;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = document.baseURI;\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/');\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      var receiveXhr = function(err, resource) {\n        this.receive(url, elt, err, resource);\n      }.bind(this);\n      xhr.load(url, receiveXhr);\n      // TODO(sorvell): blocked on\n      // https://code.google.com/p/chromium/issues/detail?id=257221\n      // xhr'ing for a document makes scripts in imports runnable; otherwise\n      // they are not; however, it requires that we have doctype=html in\n      // the import which is unacceptable. This is only needed on Chrome\n      // to avoid the bug above.\n      /*\n      if (isDocumentLink(elt)) {\n        xhr.loadDocument(url, receiveXhr);\n      } else {\n        xhr.load(url, receiveXhr);\n      }\n      */\n    },\n    receive: function(url, elt, err, resource) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(callback);\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) :\n      link.__importParsed;\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        nativePrototype = Object.getPrototypeOf(inst);\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  scope = scope || {};\n  scope.external = scope.external || {};\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    }\n  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n  function shadowSelector(v) {\n    return 'body ^^ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; touch-action-delay: none; }';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    }\n  ];\n  var styles = '';\n  attrib2css.forEach(function(r) {\n    if (String(r) === r) {\n      styles += selector(r) + rule(r) + '\\n';\n      styles += shadowSelector(r) + rule(r) + '\\n';\n    } else {\n      styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n      styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n    }\n  });\n  var el = document.createElement('style');\n  el.textContent = styles;\n  document.head.appendChild(el);\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n  // test for DOM Level 4 Events\n  var NEW_MOUSE_EVENT = false;\n  var HAS_BUTTONS = false;\n  try {\n    var ev = new MouseEvent('click', {buttons: 1});\n    NEW_MOUSE_EVENT = true;\n    HAS_BUTTONS = ev.buttons === 1;\n    ev = null;\n  } catch(e) {\n  }\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null\n  ];\n\n  function PointerEvent(inType, inDict) {\n    inDict = inDict || {};\n    // According to the w3c spec,\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button\n    // MouseEvent.button == 0 can mean either no mouse button depressed, or the\n    // left mouse button depressed.\n    //\n    // As of now, the only way to distinguish between the two states of\n    // MouseEvent.button is by using the deprecated MouseEvent.which property, as\n    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that\n    // no mouse button is held.\n    //\n    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,\n    // but initMouseEvent does not expose an argument with which to set\n    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set\n    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations\n    // of app developers.\n    //\n    // The only way to propagate the correct state of MouseEvent.which and\n    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0\n    // is to call initMouseEvent with a buttonArg value of -1.\n    //\n    // This is fixed with DOM Level 4's use of buttons\n    var buttons = inDict.buttons;\n    // touch has two possible buttons state: 0 and 1, rely on being told the right one\n    if (!HAS_BUTTONS && !buttons && inType !== 'touch') {\n      switch (inDict.which) {\n        case 1: buttons = 1; break;\n        case 2: buttons = 4; break;\n        case 3: buttons = 2; break;\n        default: buttons = 0;\n      }\n    }\n\n    var e;\n    if (NEW_MOUSE_EVENT) {\n      e = new MouseEvent(inType, inDict);\n    } else {\n      e = document.createEvent('MouseEvent');\n\n      // import values from the given dictionary\n      var props = {}, p;\n      for(var i = 0; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        props[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n\n      // define the properties inherited from MouseEvent\n      e.initMouseEvent(\n        inType, props.bubbles, props.cancelable, props.view, props.detail,\n        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,\n        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget\n      );\n    }\n\n    // make the event pass instanceof checks\n    e.__proto__ = PointerEvent.prototype;\n\n    // define the buttons property according to DOM Level 3 spec\n    if (!HAS_BUTTONS) {\n      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting\n      // mechanism\n      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});\n    }\n\n    // Spec requires that pointers without pressure specified use 0.5 for down\n    // state and 0 for up state.\n    var pressure = 0;\n    if (inDict.pressure) {\n      pressure = inDict.pressure;\n    } else {\n      pressure = buttons ? 0.5 : 0;\n    }\n\n    // define the properties of the PointerEvent interface\n    Object.defineProperties(e, {\n      pointerId: { value: inDict.pointerId || 0, enumerable: true },\n      width: { value: inDict.width || 0, enumerable: true },\n      height: { value: inDict.height || 0, enumerable: true },\n      pressure: { value: pressure, enumerable: true },\n      tiltX: { value: inDict.tiltX || 0, enumerable: true },\n      tiltY: { value: inDict.tiltY || 0, enumerable: true },\n      pointerType: { value: inDict.pointerType || '', enumerable: true },\n      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },\n      isPrimary: { value: inDict.isPrimary || false, enumerable: true }\n    });\n    return e;\n  }\n\n  // PointerEvent extends MouseEvent\n  PointerEvent.prototype = Object.create(MouseEvent.prototype);\n\n  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    targets: new WeakMap(),\n    handledEvents: new WeakMap(),\n    pointermap: new scope.PointerMap(),\n    eventMap: {},\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: {},\n    eventSourceList: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.removeEvent || function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\n      this.targets.set(e, this.targets.get(inEvent) || inEvent.target);\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      if (this.captureInfo) {\n        if (this.captureInfo.id === inEvent.pointerId) {\n          return this.captureInfo.target;\n        }\n      }\n      return this.targets.get(inEvent);\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo) {\n        this.releaseCapture(this.captureInfo.id);\n      }\n      this.captureInfo = {id: inPointerId, target: inTarget};\n      var e = new PointerEvent('gotpointercapture', { bubbles: true });\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      this.targets.set(e, inTarget);\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      if (this.captureInfo && this.captureInfo.id === inPointerId) {\n        var e = new PointerEvent('lostpointercapture', { bubbles: true });\n        var t = this.captureInfo.target;\n        this.captureInfo = null;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        this.targets.set(e, t);\n        this.asyncDispatchEvent(e);\n      }\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      setTimeout(this.dispatchEvent.bind(this, inEvent), 0);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup',\n      'mouseover',\n      'mouseout'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var findTarget = scope.findTarget;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = false;\n  \n  // handler block for native touch events\n  var touchEvents = {\n    scrollType: new WeakMap(),\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        this.scrollType.set(el, st);\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      this.scrollType['delete'](el);\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        this.scrollType['delete'](s);\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        this.scrollType.set(el, st);\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    touchToPointer: function(inTouch) {\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      e.pointerId = inTouch.identifier + 2;\n      e.target = findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\n      e.buttons = this.typeToButtons(this.currentTouchEvent);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent.type;\n      var pointers = touchMap(tl, this.touchToPointer, this);\n      // forward touch preventDefaults\n      pointers.forEach(function(p) {\n        p.preventDefault = function() {\n          this.scrolling = false;\n          this.firstXY = null;\n          inEvent.preventDefault();\n        };\n      }, this);\n      pointers.forEach(inFunction, this);\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = this.scrollType.get(inEvent.currentTarget);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(this.touchToPointer(p));\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (!this.scrolling) {\n        if (this.shouldScroll(inEvent)) {\n          this.scrolling = true;\n          this.touchcancel(inEvent);\n        } else {\n          inEvent.preventDefault();\n          this.processTouches(inEvent, this.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  // only activate if this platform does not have pointer events\n  if (window.navigator.pointerEnabled === undefined) {\n    Object.defineProperty(window.navigator, 'pointerEnabled', {value: true, enumerable: true});\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\n      dispatcher.registerSource('ms', scope.msEvents);\n    } else {\n      dispatcher.registerSource('mouse', scope.mouseEvents);\n      if (window.ontouchstart !== undefined) {\n        dispatcher.registerSource('touch', scope.touchEvents);\n      }\n    }\n\n    dispatcher.register(document);\n  }\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  /**\n   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\n        }\n        var adepth = this.depth(a);\n        var bdepth = this.depth(b);\n        var d = adepth - bdepth;\n        if (d > 0) {\n          a = this.walk(a, d);\n        } else {\n          b = this.walk(b, -d);\n        }\n        while(a && b && a !== b) {\n          a = this.walk(a, 1);\n          b = this.walk(b, 1);\n        }\n        return a;\n      },\n      walk: function(n, u) {\n        for (var i = 0; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0\n  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = {}, p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      var fn = function() {\n        this.dispatchEvent(inEvent, inTarget);\n      }.bind(this);\n      setTimeout(fn, 0);\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  // recognizers call into the dispatcher and load later\n  // solve the chicken and egg problem by having registerScopes module run last\n  dispatcher.registerQueue = [];\n  dispatcher.immediateRegister = false;\n  scope.dispatcher = dispatcher;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (dispatcher.immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      dispatcher.registerQueue.push(inScope);\n    }\n  };\n  scope.register(document);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     pointermove: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n       }\n     },\n     pointerup: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     },\n     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      var points = {};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (!e.tapPrevented) {\n        if (e.pointerType === 'mouse') {\n          // only allow left click to tap for mouse\n          return downState.buttons === 1;\n        } else {\n          return true;\n        }\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Because recognizers are loaded after dispatcher, we have to wait to register\n * scopes until after all the recognizers.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  function registerScopes() {\n    dispatcher.immediateRegister = true;\n    var rq = dispatcher.registerQueue;\n    rq.forEach(scope.register);\n    rq.length = 0;\n  }\n  if (document.readyState === 'complete') {\n    registerScopes();\n  } else {\n    // register scopes after a steadystate is reached\n    // less MutationObserver churn\n    document.addEventListener('readystatechange', function() {\n      if (document.readyState === 'complete') {\n        registerScopes();\n      }\n    });\n  }\n})(window.PointerGestures);\n","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  function unbind(node, name) {\n    var bindings = node.bindings;\n    if (!bindings) {\n      node.bindings = {};\n      return;\n    }\n\n    var binding = bindings[name];\n    if (!binding)\n      return;\n\n    binding.close();\n    bindings[name] = undefined;\n  }\n\n  Node.prototype.unbind = function(name) {\n    unbind(this, name);\n  };\n\n  Node.prototype.unbindAll = function() {\n    if (!this.bindings)\n      return;\n    var names = Object.keys(this.bindings);\n    for (var i = 0; i < names.length; i++) {\n      var binding = this.bindings[names[i]];\n      if (binding)\n        binding.close();\n    }\n\n    this.bindings = {};\n  };\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    unbind(this, 'textContent');\n    updateText(this, value.open(textBinding(this)));\n    return this.bindings.textContent = value;\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n    unbind(this, name);\n    updateAttribute(this, name, conditional,\n        value.open(attributeBinding(this, name, conditional)));\n\n    return this.bindings[name] = value;\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    var capturedClose = observable.close;\n    observable.close = function() {\n      if (!capturedClose)\n        return;\n      input.removeEventListener(eventType, eventHandler);\n\n      observable.close = capturedClose;\n      observable.close();\n      capturedClose = undefined;\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value, postEventFn);\n    updateInput(this, name,\n                value.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    return this.bindings[name] = value;\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateInput(this, 'value',\n                value.open(inputBinding(this, 'value', sanitizeValue)));\n\n    return this.bindings.value = value;\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings &&\n        parentNode.bindings.value) {\n      select = parentNode;\n      selectBinding = select.bindings.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.setValue(select.value);\n      selectBinding.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateOption(this, value.open(optionBinding(this)));\n    return this.bindings.value = value;\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    unbind(this, name);\n    bindInputEvent(this, name, value);\n    updateInput(this, name,\n                value.open(inputBinding(this, name)));\n    return this.bindings[name] = value;\n  }\n})(this);\n","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      this.unbind('ref');\n      return this.bindings.ref = value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n          this.bindings.iterator = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n        this.bindings = this.bindings || {};\n        this.bindings.iterator = this.iterator_;\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_,\n                             instanceBindings_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      var map = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n\n      var instanceRecord = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instanceBindings_);\n        clone.templateInstance_ = instanceRecord;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      this.bindings_ = undefined;\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return {};\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      tokens.push(Path.get(pathString)); // PATH\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n\n    // Flattened array of tuples:\n    //   <instanceTerminatorNode, [bindingsSetupByInstance]>\n    this.terminators = [];\n\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getTerminatorAt: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var terminator = this.terminators[index*2];\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subIterator = terminator.iterator_;\n      if (!subIterator)\n        return terminator;\n\n      return subIterator.getTerminatorAt(subIterator.terminators.length/2 - 1);\n    },\n\n    // TODO(rafaelw): If we inserting sequences of instances we can probably\n    // avoid lots of calls to getTerminatorAt(), or cache its result.\n    insertInstanceAt: function(index, fragment, instanceNodes,\n                               instanceBindings) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = previousTerminator;\n      if (fragment)\n        terminator = fragment.lastChild || terminator;\n      else if (instanceNodes)\n        terminator = instanceNodes[instanceNodes.length - 1] || terminator;\n\n      this.terminators.splice(index*2, 0, terminator, instanceBindings);\n      var parent = this.templateElement_.parentNode;\n      var insertBeforeNode = previousTerminator.nextSibling;\n\n      if (fragment) {\n        parent.insertBefore(fragment, insertBeforeNode);\n      } else if (instanceNodes) {\n        for (var i = 0; i < instanceNodes.length; i++)\n          parent.insertBefore(instanceNodes[i], insertBeforeNode);\n      }\n    },\n\n    extractInstanceAt: function(index) {\n      var instanceNodes = [];\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      instanceNodes.instanceBindings = this.terminators[index*2 + 1];\n      this.terminators.splice(index*2, 2);\n\n      var parent = this.templateElement_.parentNode;\n      while (terminator !== previousTerminator) {\n        var node = previousTerminator.nextSibling;\n        if (node == terminator)\n          terminator = previousTerminator;\n\n        parent.removeChild(node);\n        instanceNodes.push(node);\n      }\n\n      return instanceNodes;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      splices.forEach(function(splice) {\n        splice.removed.forEach(function(model) {\n          var instanceNodes =\n              this.extractInstanceAt(splice.index + removeDelta);\n          instanceCache.set(model, instanceNodes);\n        }, this);\n\n        removeDelta -= splice.addedCount;\n      }, this);\n\n      splices.forEach(function(splice) {\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var fragment = undefined;\n          var instanceNodes = instanceCache.get(model);\n          var instanceBindings;\n          if (instanceNodes) {\n            instanceCache.delete(model);\n            instanceBindings = instanceNodes.instanceBindings;\n          } else {\n            instanceBindings = [];\n            if (this.instanceModelFn_)\n              model = this.instanceModelFn_(model);\n\n            if (model !== undefined) {\n              fragment = template.createInstance(model, undefined, delegate,\n                                                 instanceBindings);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, fragment, instanceNodes,\n                                instanceBindings);\n        }\n      }, this);\n\n      instanceCache.forEach(function(instanceNodes) {\n        this.closeInstanceBindings(instanceNodes.instanceBindings);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      if (previousTerminator === terminator)\n        return; // instance has zero nodes.\n\n      // We must use the first node of the instance, because any subsequent\n      // nodes may have been generated by sub-templates.\n      // TODO(rafaelw): This is brittle WRT instance mutation -- e.g. if the\n      // first node was removed by script.\n      var templateInstance = previousTerminator.nextSibling.templateInstance;\n      this.instancePositionChangedFn_(templateInstance, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.terminators.length / 2;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instanceBindings) {\n      for (var i = 0; i < instanceBindings.length; i++) {\n        instanceBindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 1; i < this.terminators.length; i += 2) {\n        this.closeInstanceBindings(this.terminators[i]);\n      }\n\n      this.terminators.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright 2013 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function (global) {\n  'use strict';\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (this.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\n            if (observer)\n              observer.addPath(context, propName);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(value, toModelDirection, filterRegistry, model,\n                        observer) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer) {\n        return unaryOperators[op](argument(model, observer));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      this.getValue(model, observer, filterRegistry);  // captures deps.\n      var self = this;\n\n      function valueFn() {\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(newValue, true, filterRegistry,\n                                                 model);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\n  }\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\n\n      if (path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          }\n        }\n\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\nvar FLUSH_POLL_INTERVAL = 125;\nwindow.addEventListener('WebComponentsReady', function() {\n  flush();\n  // flush periodically if platform does not have object observe.\n  if (!Observer.hasObjectObserve) {\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  }\n});\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index 7dc6f80..8ed3bca 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.3.1
+version: 0.3.2
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/runtime/bin/eventhandler.h b/runtime/bin/eventhandler.h
index 6ac1ef4..347d0e0 100644
--- a/runtime/bin/eventhandler.h
+++ b/runtime/bin/eventhandler.h
@@ -7,6 +7,7 @@
 
 #include "bin/builtin.h"
 #include "bin/isolate_data.h"
+#include "bin/socket.h"
 
 namespace dart {
 namespace bin {
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 41d6f13..62fea29 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -810,6 +810,61 @@
 }
 
 
+static const char* ServiceRequestError(const char* message) {
+  TextBuffer buffer(128);
+  buffer.Printf("{\"type\":\"Error\",\"text\":\"%s\"}", message);
+  return buffer.Steal();
+}
+
+
+static const char* ServiceRequestError(Dart_Handle error) {
+  TextBuffer buffer(128);
+  buffer.Printf("{\"type\":\"Error\",\"text\":\"Internal error %s\"}",
+                Dart_GetError(error));
+  return buffer.Steal();
+}
+
+
+class DartScope {
+ public:
+  DartScope() { Dart_EnterScope(); }
+  ~DartScope() { Dart_ExitScope(); }
+};
+
+
+static const char* ServiceRequestHandler(
+    const char* name,
+    const char** arguments,
+    intptr_t num_arguments,
+    const char** option_keys,
+    const char** option_values,
+    intptr_t num_options,
+    void* user_data) {
+  DartScope scope;
+  const char* kSockets = "sockets";
+  if (num_arguments == 2 &&
+      strncmp(arguments[1], kSockets, strlen(kSockets)) == 0) {
+    Dart_Handle dart_io_str = Dart_NewStringFromCString("dart:io");
+    if (Dart_IsError(dart_io_str)) return ServiceRequestError(dart_io_str);
+    Dart_Handle io_lib = Dart_LookupLibrary(dart_io_str);
+    if (Dart_IsError(io_lib)) return ServiceRequestError(io_lib);
+    Dart_Handle handler_function_name =
+        Dart_NewStringFromCString("_socketsStats");
+    if (Dart_IsError(handler_function_name)) {
+      return ServiceRequestError(handler_function_name);
+    }
+    Dart_Handle result = Dart_Invoke(io_lib, handler_function_name, 0, NULL);
+    if (Dart_IsError(result)) return ServiceRequestError(result);
+    const char *json;
+    result = Dart_StringToCString(result, &json);
+    if (Dart_IsError(result)) return ServiceRequestError(result);
+    return strdup(json);
+  } else {
+    return ServiceRequestError("Unrecognized path");
+  }
+}
+
+
 void main(int argc, char** argv) {
   char* script_name;
   CommandLineOptions vm_options(argc);
@@ -894,6 +949,8 @@
       Log::PrintErr("Could not start VM Service isolate %s\n",
                     VmService::GetErrorMessage());
     }
+    Dart_RegisterIsolateServiceRequestCallback(
+        "io", &ServiceRequestHandler, NULL);
   }
 
   // Call CreateIsolateAndSetup which creates an isolate and loads up
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index de890888..586d6d4 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -18,9 +18,7 @@
 // Only run tests that match the filter string. The default does not match any
 // tests.
 static const char* const kNone = "No Test or Benchmarks";
-static const char* const kAll = "All";
 static const char* const kList = "List all Tests and Benchmarks";
-static const char* const kAllTests = "All Tests";
 static const char* const kAllBenchmarks = "All Benchmarks";
 static const char* run_filter = kNone;
 
@@ -35,9 +33,7 @@
 
 
 void TestCaseBase::RunTest() {
-  if ((run_filter == kAll) ||
-      (run_filter == kAllTests) ||
-      (strcmp(run_filter, this->name()) == 0)) {
+  if (strcmp(run_filter, this->name()) == 0) {
     this->Run();
     run_matches++;
   } else if (run_filter == kList) {
@@ -48,8 +44,7 @@
 
 
 void Benchmark::RunBenchmark() {
-  if ((run_filter == kAll) ||
-      (run_filter == kAllBenchmarks) ||
+  if ((run_filter == kAllBenchmarks) ||
       (strcmp(run_filter, this->name()) == 0)) {
     this->Run();
     OS::Print("%s(RunTime): %" Pd "\n", this->name(), this->score());
@@ -63,7 +58,7 @@
 
 static void PrintUsage() {
   fprintf(stderr, "run_vm_tests [--list | --benchmarks | "
-                  "--tests | --all | <test name> | <benchmark name>]\n");
+                  "<test name> | <benchmark name>]\n");
   fprintf(stderr, "run_vm_tests [vm-flags ...] <test name>\n");
   fprintf(stderr, "run_vm_tests [vm-flags ...] <benchmark name>\n");
 }
@@ -85,10 +80,6 @@
       TestCaseBase::RunAll();
       Benchmark::RunAll(argv[0]);
       return 0;
-    } else if (strcmp(argv[1], "--all") == 0) {
-      run_filter = kAll;
-    } else if (strcmp(argv[1], "--tests") == 0) {
-      run_filter = kAllTests;
     } else if (strcmp(argv[1], "--benchmarks") == 0) {
       run_filter = kAllBenchmarks;
     } else {
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 42937a4..0e5de6b 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -190,10 +190,6 @@
           getpeername(fd,
                       &raw.addr,
                       &size))) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("Error getpeername: %s\n", error_message);
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 133e333..1a54a1e 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -188,10 +188,6 @@
           getpeername(fd,
                       &raw.addr,
                       &size))) {
-    const int kBufferSize = 1024;
-    char error_buf[kBufferSize];
-    Log::PrintErr("Error getpeername: %s\n",
-                  strerror_r(errno, error_buf, kBufferSize));
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 6194289..1d0198c 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -192,10 +192,6 @@
           getpeername(fd,
                       &raw.addr,
                       &size))) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("Error getpeername: %s\n", error_message);
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index c69ff18..7806964 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -207,6 +207,131 @@
 }
 
 
+class _Rate {
+  final int buckets;
+  final data;
+  int lastValue = 0;
+  int nextBucket = 0;
+
+  _Rate(int buckets) : buckets = buckets, data = new List.filled(buckets, 0);
+
+  void update(int value) {
+    data[nextBucket] = value - lastValue;
+    lastValue = value;
+    nextBucket = (nextBucket + 1) % buckets;
+  }
+
+  int get rate {
+    int sum = data.fold(0, (prev, element) => prev + element);
+    return sum ~/ buckets;
+  }
+}
+
+// Statics information for the observatory.
+class _SocketStat {
+  _Rate readRate = new _Rate(5);
+  _Rate writeRate = new _Rate(5);
+
+  void update(_NativeSocket socket) {
+    readRate.update(socket.totalRead);
+    writeRate.update(socket.totalWritten);
+  }
+}
+
+class _SocketsObservatory {
+  static int socketCount = 0;
+  static Map sockets = new Map<_NativeSocket, _SocketStat>();
+  static Timer timer;
+
+  static add(_NativeSocket socket) {
+    if (socketCount == 0) startTimer();
+    sockets[socket] = new _SocketStat();
+    socketCount++;
+  }
+
+  static remove(_NativeSocket socket) {
+    _SocketStat stats = sockets.remove(socket);
+    assert(stats != null);
+    socketCount--;
+    if (socketCount == 0) stopTimer();
+  }
+
+  static update(_) {
+    sockets.forEach((socket, stat) {
+      stat.update(socket);
+    });
+  }
+
+  static startTimer() {
+    if (timer != null) return;
+    // TODO(sgjesse): Enable the rate timer.
+    // timer = new Timer.periodic(new Duration(seconds: 1), update);
+  }
+
+  static stopTimer() {
+    if (timer == null) return;
+    timer.cancel();
+    timer = null;
+  }
+
+  static String generateResponse() {
+    var response = new Map();
+    response['type'] = 'SocketList';
+    var members = new List();
+    response['members'] = members;
+    sockets.forEach((socket, stat) {
+      var kind =
+          socket.isListening ? "LISTENING" :
+          socket.isPipe ? "PIPE" :
+          socket.isInternal ? "INTERNAL" : "NORMAL";
+      var protocol =
+          socket.isTcp ? "tcp" :
+          socket.isUdp ? "udp" : "";
+      var localAddress;
+      var localPort;
+      var remoteAddress;
+      var remotePort;
+      try {
+        localAddress = socket.address.address;
+      } catch (e) {
+        localAddress = "n/a";
+      }
+      try {
+        localPort = socket.port;
+      } catch (e) {
+        localPort = "n/a";
+      }
+      try {
+        remoteAddress = socket.remoteAddress.address;
+      } catch (e) {
+        remoteAddress = "n/a";
+      }
+      try {
+        remotePort = socket.remotePort;
+      } catch (e) {
+        remotePort = "n/a";
+      }
+      members.add({'type': 'Socket', 'kind': kind, 'protocol': protocol,
+                   'localAddress': localAddress, 'localPort': localPort,
+                   'remoteAddress': remoteAddress, 'remotePort': remotePort,
+                   'totalRead': socket.totalRead,
+                   'totalWritten': socket.totalWritten,
+                   'readPerSec': stat.readRate.rate,
+                   'writePerSec': stat.writeRate.rate});
+    });
+    return JSON.encode(response);;
+  }
+
+  static String toJSON() {
+    try {
+      return generateResponse();
+    } catch (e, s) {
+      return '{"type":"Error","text":"$e","stacktrace":"$s"}';
+    }
+  }
+}
+
+
 // The _NativeSocket class encapsulates an OS socket.
 class _NativeSocket extends NativeFieldWrapperClass1 {
   // Bit flags used when communicating between the eventhandler and
@@ -240,6 +365,18 @@
   static const int TYPE_NORMAL_SOCKET = 0;
   static const int TYPE_LISTENING_SOCKET = 1 << LISTENING_SOCKET;
   static const int TYPE_PIPE = 1 << PIPE_SOCKET;
+  static const int TYPE_TYPE_MASK = TYPE_LISTENING_SOCKET | PIPE_SOCKET;
+
+  // Protocol flags.
+  static const int TCP_SOCKET = 18;
+  static const int UDP_SOCKET = 19;
+  static const int INTERNAL_SOCKET = 20;
+  static const int TYPE_TCP_SOCKET = 1 << TCP_SOCKET;
+  static const int TYPE_UDP_SOCKET = 1 << UDP_SOCKET;
+  static const int TYPE_INTERNAL_SOCKET = 1 << INTERNAL_SOCKET;
+  static const int TYPE_PROTOCOL_MASK =
+      TYPE_TCP_SOCKET | TYPE_UDP_SOCKET | TYPE_INTERNAL_SOCKET;
+
 
   // Native port messages.
   static const HOST_NAME_LOOKUP = 0;
@@ -279,6 +416,10 @@
   bool writeEventIssued = false;
   bool writeAvailable = false;
 
+  // Statistics.
+  int totalRead = 0;
+  int totalWritten = 0;
+
   static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
     return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value])
@@ -433,19 +574,27 @@
         });
   }
 
-  _NativeSocket.datagram(this.address) : typeFlags = TYPE_NORMAL_SOCKET;
+  _NativeSocket.datagram(this.address)
+    : typeFlags = TYPE_NORMAL_SOCKET | TYPE_UDP_SOCKET;
 
-  _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET;
+  _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET | TYPE_TCP_SOCKET;
 
-  _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET;
+  _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET | TYPE_TCP_SOCKET;
 
   _NativeSocket.pipe() : typeFlags = TYPE_PIPE;
 
-  _NativeSocket.watch(int id) : typeFlags = TYPE_NORMAL_SOCKET {
+  _NativeSocket.watch(int id)
+      : typeFlags = TYPE_NORMAL_SOCKET | TYPE_INTERNAL_SOCKET {
     isClosedWrite = true;
     nativeSetSocketId(id);
   }
 
+  bool get isListening => (typeFlags & TYPE_LISTENING_SOCKET) != 0;
+  bool get isPipe => (typeFlags & TYPE_PIPE) != 0;
+  bool get isInternal => (typeFlags & TYPE_INTERNAL_SOCKET) != 0;
+  bool get isTcp => (typeFlags & TYPE_TCP_SOCKET) != 0;
+  bool get isUdp => (typeFlags & TYPE_UDP_SOCKET) != 0;
+
   List<int> read(int len) {
     if (len != null && len <= 0) {
       throw new ArgumentError("Illegal length $len");
@@ -458,7 +607,10 @@
       reportError(result, "Read failed");
       return null;
     }
-    if (result != null) available -= result.length;
+    if (result != null) {
+      available -= result.length;
+      totalRead += result.length;
+    }
     return result;
   }
 
@@ -516,6 +668,7 @@
     }
     // Negate the result, as stated above.
     if (result < 0) result = -result;
+    totalWritten += result;
     return result;
   }
 
@@ -542,12 +695,15 @@
     if (nativeAccept(socket) != true) return null;
     socket.localPort = localPort;
     socket.address = address;
+    totalRead += 1;
     return socket;
   }
 
   int get port {
     if (localPort != 0) return localPort;
-    return localPort = nativeGetPort();
+    var result = nativeGetPort();
+    if (result is OSError) throw result;
+    return localPort = result;
   }
 
   int get remotePort {
@@ -613,7 +769,7 @@
         if ((i == CLOSED_EVENT || i == READ_EVENT) && isClosedRead) continue;
         if (isClosing && i != DESTROYED_EVENT) continue;
         if (i == CLOSED_EVENT &&
-            typeFlags != TYPE_LISTENING_SOCKET &&
+            !isListening  &&
             !isClosing &&
             !isClosed) {
           isClosedRead = true;
@@ -627,8 +783,7 @@
           continue;
         }
 
-        if (i == READ_EVENT &&
-            typeFlags != TYPE_LISTENING_SOCKET) {
+        if (i == READ_EVENT && !isListening) {
           var avail = nativeAvailable();
           if (avail is int) {
             available = avail;
@@ -678,7 +833,7 @@
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
     if (eventPort == null) {
-      int flags = typeFlags;
+      int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
       sendToEventHandler(flags);
@@ -742,6 +897,7 @@
   void connectToEventHandler() {
     if (eventPort == null) {
       eventPort = new RawReceivePort(multiplex);
+      _SocketsObservatory.add(this);
     }
   }
 
@@ -749,6 +905,7 @@
     assert(eventPort != null);
     eventPort.close();
     eventPort = null;
+    _SocketsObservatory.remove(this);
   }
 
   // Check whether this is an error response from a native port call.
@@ -1598,3 +1755,5 @@
       new _InternetAddress(address, null, in_addr),
       port);
 }
+
+String _socketsStats() => _SocketsObservatory.toJSON();
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 2675dce..77c51ef 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -116,7 +116,6 @@
   if (getpeername(socket_handle->socket(),
                   &raw.addr,
                   &size)) {
-    Log::PrintErr("Error getpeername: %d\n", WSAGetLastError());
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
diff --git a/runtime/bin/vmservice/client/build_.dart b/runtime/bin/vmservice/client/build_.dart
index 6b7d11f..58f306f 100644
--- a/runtime/bin/vmservice/client/build_.dart
+++ b/runtime/bin/vmservice/client/build_.dart
@@ -4,7 +4,6 @@
 
 import 'package:polymer/builder.dart';
 import 'dart:io';
-import 'dart:async';
 
 main() {
   lint()
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 1441387..62a33f6 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -14,6 +14,9 @@
 <body><polymer-element name="observatory-element">
   
 </polymer-element>
+<polymer-element name="isolate-element" extends="observatory-element">
+  
+</polymer-element>
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
     <style>
@@ -169,41 +172,40 @@
   </template>
 </polymer-element>
 
-<polymer-element name="isolate-nav-menu" extends="observatory-element">
+<polymer-element name="isolate-nav-menu" extends="isolate-element">
   <template>
     <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="library-nav-menu" extends="observatory-element">
+<polymer-element name="library-nav-menu" extends="isolate-element">
   <template>
-    <nav-menu link="{{ app.locationManager.currentIsolateRelativeLink(library['id']) }}" anchor="{{ library['name'] }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink(library['id']) }}" anchor="{{ library['name'] }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="class-nav-menu" extends="observatory-element">
+<polymer-element name="class-nav-menu" extends="isolate-element">
   <template>
-    <nav-menu link="{{ app.locationManager.currentIsolateRelativeLink(cls['id']) }}" anchor="{{ cls['user_name'] }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink(cls['id']) }}" anchor="{{ cls['user_name'] }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
 
-<polymer-element name="breakpoint-list" extends="observatory-element">
+<polymer-element name="breakpoint-list" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -225,7 +227,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="service-ref" extends="observatory-element">
+<polymer-element name="service-ref" extends="isolate-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
 <template>
@@ -319,7 +321,7 @@
       </template>
 
       <template if="{{ isNullRef(ref['type']) }}">
-        {{ name }}
+        <div title="{{ hoverText }}">{{ name }}</div>
       </template>
 
       <template if="{{ (isStringRef(ref['type']) ||
@@ -341,7 +343,7 @@
             <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
               <td class="member">{{ field['decl']['user_name'] }}</td>
               <td class="member">
-                <instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -355,7 +357,7 @@
             <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
               <td class="member">[{{ element['index']}}]</td>
               <td class="member">
-                <instance-ref app="{{ app }}" ref="{{ element['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ element['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -371,14 +373,13 @@
   <a href="{{ url }}">{{ name }}</a>
 </template>
 
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
+</polymer-element><polymer-element name="class-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <library-nav-menu app="{{ app }}" library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu app="{{ app }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <library-nav-menu isolate="{{ isolate }}" library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu isolate="{{ isolate }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -468,12 +469,11 @@
   </div>
   </template>
   
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
+</polymer-element><polymer-element name="code-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="{{ code.functionRef['user_name'] }}" last="{{ true }}"></nav-menu>
       <!-- TODO(turnidge): Implement code refresh -->
     </nav-bar>
@@ -482,7 +482,7 @@
     <div class="col-md-8 col-md-offset-2">
       <div class="{{ cssPanelClass }}">
         <div class="panel-heading">
-          <function-ref app="{{ app }}" ref="{{ code.functionRef }}"></function-ref>
+          <function-ref isolate="{{ isolate }}" ref="{{ code.functionRef }}"></function-ref>
         </div>
         <div class="panel-body">
           <div class="row">
@@ -513,18 +513,17 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="field-view" extends="observatory-element">
+</polymer-element><polymer-element name="field-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <template if="{{ field['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu app="{{ app }}" cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu isolate="{{ isolate }}" cls="{{ field['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ field['owner']['type'] == '@Library' }}">
-        <library-nav-menu app="{{ app }}" library="{{ field['owner'] }}"></library-nav-menu>
+        <library-nav-menu isolate="{{ isolate }}" library="{{ field['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -538,7 +537,7 @@
           <template if="{{ field['final'] }}">final</template>
           <template if="{{ field['const'] }}">const</template>
           {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref app="{{ app }}" ref="{{ field['class'] }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ field['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
         <template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -557,7 +556,7 @@
             </div>
           </template>
           <blockquote>
-            <class-ref app="{{ app }}" ref="{{ field['guard_class'] }}"></class-ref>
+            <class-ref isolate="{{ isolate }}" ref="{{ field['guard_class'] }}"></class-ref>
           </blockquote>
         </template>
         </div>
@@ -567,18 +566,17 @@
   </template>
   
 </polymer-element>
-<polymer-element name="function-view" extends="observatory-element">
+<polymer-element name="function-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <template if="{{ function['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu app="{{ app }}" cls="{{ function['owner'] }}"></class-nav-menu>
+        <class-nav-menu isolate="{{ isolate }}" cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ function['owner']['type'] == '@Library' }}">
-        <library-nav-menu app="{{ app }}" library="{{ function['owner'] }}"></library-nav-menu>
+        <library-nav-menu isolate="{{ isolate }}" library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -589,12 +587,12 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
           {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref app="{{ app }}" ref="{{ function['class'] }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ function['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <div>
-          <code-ref app="{{ app }}" ref="{{ function['code'] }}"></code-ref>
-          <code-ref app="{{ app }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
+          <code-ref isolate="{{ isolate }}" ref="{{ function['code'] }}"></code-ref>
+          <code-ref isolate="{{ isolate }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
           </div>
           <table class="table table-hover">
             <tbody>
@@ -637,7 +635,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="isolate-summary" extends="observatory-element">
+<polymer-element name="isolate-summary" extends="isolate-element">
   <template>
     <div class="row">
       <div class="col-md-1">
@@ -651,7 +649,7 @@
 
         <div class="row">
           <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ app.locationManager.relativeLink(isolate.id, isolate.entry['id']) }}">
+            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
               {{ isolate.name }}
             </a>
           </template>
@@ -662,9 +660,9 @@
 
         <div class="row">
           <small>
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, isolate.rootLib) }}">library</a>)
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, 'debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, 'profile') }}">profile</a>)
+            (<a href="{{ isolate.hashLink(isolate.rootLib) }}">library</a>)
+            (<a href="{{ isolate.hashLink('debug/breakpoints') }}">breakpoints</a>)
+            (<a href="{{ isolate.hashLink('profile') }}">profile</a>)
           </small>
         </div>
       </div>
@@ -697,7 +695,7 @@
         </div>
       </div>
       <div class="col-md-2">
-        <a href="{{ app.locationManager.relativeLink(isolate.id, 'allocationprofile') }}">
+        <a href="{{ isolate.hashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
       </div>
@@ -708,7 +706,7 @@
         <template if="{{ isolate.topFrame != null }}">
           run
         </template>
-        ( <a href="{{ app.locationManager.relativeLink(isolate.id, 'stacktrace') }}">stack trace</a> )
+        ( <a href="{{ isolate.hashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
     <div class="row">
@@ -716,8 +714,8 @@
       </div>
       <div class="col-md-6">
         <template if="{{ isolate.topFrame != null }}">
-          <function-ref app="{{ app }}" isolate="{{ isolate }}" ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref app="{{ app }}" isolate="{{ isolate }}" ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+          <function-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['function'] }}"></function-ref>
+          (<script-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
           <br>
           <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
         </template>
@@ -728,7 +726,10 @@
   </template>
   
 </polymer-element>
-<polymer-element name="isolate-list" extends="observatory-element">
+<polymer-element name="vm-element" extends="observatory-element">
+  
+</polymer-element>
+<polymer-element name="isolate-list" extends="vm-element">
   <template>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -736,24 +737,22 @@
       <nav-refresh callback="{{ refresh } }}"></nav-refresh>
     </nav-bar>
       <ul class="list-group">
-      <template repeat="{{ isolate in app.isolateManager.isolates.values }}">
+      <template repeat="{{ isolate in vm.isolates.values }}">
       	<li class="list-group-item">
-        <isolate-summary app="{{ app }}" isolate="{{ isolate }}"></isolate-summary>
+        <isolate-summary isolate="{{ isolate }}"></isolate-summary>
         </li>
       </template>
       </ul>
-      (<a href="{{ app.locationManager.absoluteLink('cpu') }}">cpu</a>)
   </template>
   
 </polymer-element>
-<polymer-element name="instance-view" extends="observatory-element">
+<polymer-element name="instance-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <!-- TODO(turnidge): Add library nav menu here. -->
-      <class-nav-menu app="{{ app }}" cls="{{ instance['class'] }}"></class-nav-menu>
+      <class-nav-menu isolate="{{ isolate }}" cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
       <!-- TODO(turnidge): Add nav refresh here. -->
     </nav-bar>
@@ -763,7 +762,7 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
          Instance of
-         <class-ref app="{{ app }}" ref="{{ instance['class'] }}"></class-ref>
+         <class-ref isolate="{{ isolate }}" ref="{{ instance['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <template if="{{ instance['error'] == null }}">
@@ -778,8 +777,8 @@
             <table class="table table-hover">
              <tbody>
                 <tr template="" repeat="{{ field in instance['fields'] }}">
-                  <td><field-ref app="{{ app }}" ref="{{ field['decl'] }}"></field-ref></td>
-                  <td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
+                  <td><field-ref isolate="{{ isolate }}" ref="{{ field['decl'] }}"></field-ref></td>
+                  <td><instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -824,13 +823,12 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-view" extends="observatory-element">
+<polymer-element name="library-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <library-nav-menu app="{{ app }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <library-nav-menu isolate="{{ isolate }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -842,7 +840,7 @@
           {{ script['kind'] }}
         </td>
         <td>
-          <script-ref app="{{ app }}" ref="{{ script }}"></script-ref>
+          <script-ref isolate="{{ isolate }}" ref="{{ script }}"></script-ref>
         </td>
       </tr>
     </tbody>
@@ -852,7 +850,7 @@
     <tbody>
       <tr template="" repeat="{{ lib in library['libraries'] }}">
         <td>
-          <library-ref app="{{ app }}" ref="{{ lib }}"></library-ref>
+          <library-ref isolate="{{ isolate }}" ref="{{ lib }}"></library-ref>
         </td>
       </tr>
     </tbody>
@@ -861,8 +859,8 @@
   <table class="table table-hover">
     <tbody>
       <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref app="{{ app }}" ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref app="{{ app }}" ref="{{ variable['value'] }}"></instance-ref></td>
+        <td><field-ref isolate="{{ isolate }}" ref="{{ variable }}"></field-ref></td>
+        <td><instance-ref isolate="{{ isolate }}" ref="{{ variable['value'] }}"></instance-ref></td>
       </tr>
     </tbody>
   </table>
@@ -871,7 +869,7 @@
     <tbody>
       <tr template="" repeat="{{ func in library['functions'] }}">
         <td>
-          <function-ref app="{{ app }}" ref="{{ func }}"></function-ref>
+          <function-ref isolate="{{ isolate }}" ref="{{ func }}"></function-ref>
         </td>
       </tr>
     </tbody>
@@ -887,10 +885,10 @@
     <tbody>
       <tr template="" repeat="{{ cls in library['classes'] }}">
         <td>
-          <class-ref app="{{ app }}" ref="{{ cls }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ cls }}"></class-ref>
         </td>
         <td>
-          <class-ref app="{{ app }}" ref="{{ cls }}" internal=""></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ cls }}" internal=""></class-ref>
         </td>
       </tr>
     </tbody>
@@ -899,12 +897,11 @@
   </template>
   
 </polymer-element>
-<polymer-element name="heap-profile" extends="observatory-element">
+<polymer-element name="heap-profile" extends="isolate-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-    </isolate-nav-menu>
+    <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
     <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
@@ -967,13 +964,58 @@
 </template>
 
 </polymer-element>
-<polymer-element name="script-view" extends="observatory-element">
+<polymer-element name="isolate-profile" extends="isolate-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <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>
+        <tr>
+          <th>Method</th>
+          <th>Exclusive</th>
+          <th>Caller</th>
+          <th>Inclusive</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+            <code-ref isolate="{{ isolate }}" ref="{{ row.code.codeRef }}"></code-ref>
+          </td>
+          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
+        </tr>
+      </tbody>
+    </table>
+  </template>
+  
+</polymer-element>
+<polymer-element name="script-view" extends="isolate-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
+    <isolate-nav-menu isolate="{{ isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu app="{{ app }}" library="{{ script.libraryRef }}"></library-nav-menu>
+    <library-nav-menu isolate="{{ isolate }}" library="{{ script.libraryRef }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.shortName }}" last="{{ true }}"></nav-menu>
   </nav-bar>
 
@@ -1000,7 +1042,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="stack-frame" extends="observatory-element">
+<polymer-element name="stack-frame" extends="isolate-element">
   <template>
     <style>
       .member {
@@ -1014,15 +1056,15 @@
         #{{ frame['depth'] }}
       </div>
       <div class="col-md-9">
-        <function-ref app="{{ app }}" ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref app="{{ app }}" ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        <function-ref isolate="{{ isolate }}" ref="{{ frame['function'] }}"></function-ref>
+        ( <script-ref isolate="{{ isolate }}" 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 app="{{ app }}" ref="{{ v['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ v['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -1036,12 +1078,11 @@
   </template>
   
 </polymer-element>
-<polymer-element name="stack-trace" extends="observatory-element">
+<polymer-element name="stack-trace" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -1056,7 +1097,7 @@
       <ul class="list-group">
         <template repeat="{{ frame in trace['members'] }}">
           <li class="list-group-item">
-            <stack-frame app="{{ app }}" frame="{{ frame }}"></stack-frame>
+            <stack-frame isolate="{{ isolate }}" frame="{{ frame }}"></stack-frame>
           </li>
         </template>
       </ul>
@@ -1072,122 +1113,75 @@
   <template>
   	<!-- If the message type is an IsolateList -->
     <template if="{{ messageType == 'IsolateList' }}">
-      <isolate-list app="{{ app }}"></isolate-list>
+      <isolate-list vm="{{ app.vm }}"></isolate-list>
     </template>
     <!-- If the message type is a StackTrace -->
     <template if="{{ messageType == 'StackTrace' }}">
-      <stack-trace app="{{ app }}" trace="{{ message }}"></stack-trace>
+      <stack-trace isolate="{{ app.isolate }}" trace="{{ message }}"></stack-trace>
     </template>
     <template if="{{ messageType == 'BreakpointList' }}">
-      <breakpoint-list app="{{ app }}" msg="{{ message }}"></breakpoint-list>
+      <breakpoint-list isolate="{{ app.isolate }}" msg="{{ message }}"></breakpoint-list>
     </template>
     <template if="{{ messageType == 'Error' }}">
-      <error-view app="{{ app }}" error="{{ message }}"></error-view>
+      <error-view isolate="{{ app.isolate }}" error="{{ message }}"></error-view>
     </template>
     <template if="{{ messageType == 'Library' }}">
-      <library-view app="{{ app }}" library="{{ message }}"></library-view>
+      <library-view isolate="{{ app.isolate }}" library="{{ message }}"></library-view>
     </template>
     <template if="{{ messageType == 'Class' }}">
-      <class-view app="{{ app }}" cls="{{ message }}"></class-view>
+      <class-view isolate="{{ app.isolate }}" cls="{{ message }}"></class-view>
     </template>
     <template if="{{ messageType == 'Field' }}">
-      <field-view app="{{ app }}" field="{{ message }}"></field-view>
+      <field-view isolate="{{ app.isolate }}" field="{{ message }}"></field-view>
     </template>
     <template if="{{ messageType == 'Closure' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Instance' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Array' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'GrowableObjectArray' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'String' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Bool' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Smi' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Function' }}">
-      <function-view app="{{ app }}" function="{{ message }}"></function-view>
+      <function-view isolate="{{ app.isolate }}" function="{{ message }}"></function-view>
     </template>
     <template if="{{ messageType == 'Code' }}">
-      <code-view app="{{ app }}" code="{{ message['code'] }}"></code-view>
+      <code-view isolate="{{ app.isolate }}" code="{{ message['code'] }}"></code-view>
     </template>
     <template if="{{ messageType == 'Script' }}">
-      <script-view app="{{ app }}" script="{{ message['script'] }}"></script-view>
+      <script-view isolate="{{ app.isolate }}" script="{{ message['script'] }}"></script-view>
     </template>
     <template if="{{ messageType == 'AllocationProfile' }}">
-      <heap-profile app="{{ app }}" profile="{{ message }}"></heap-profile>
+      <heap-profile isolate="{{ app.isolate }}" profile="{{ message }}"></heap-profile>
     </template>
-    <template if="{{ messageType == 'CPU' }}">
-      <json-view json="{{ message }}"></json-view>
+    <template if="{{ messageType == 'Profile' }}">
+      <isolate-profile isolate="{{ app.isolate }}" profile="{{ message }}"></isolate-profile>
     </template>
     <!-- Add new views and message types in the future here. -->
   </template>
   
 </polymer-element>
-<polymer-element name="isolate-profile" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-
-    <div>
-      <span>Top</span>
-      <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-        <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-      </select>
-      <span>exclusive methods</span>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
-        <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
-          <th>Inclusive</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref app="{{ app }}" ref="{{ row.code.codeRef }}"></code-ref>
-          </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
-        </tr>
-      </tbody>
-    </table>
-  </template>
-  
-</polymer-element>
 <polymer-element name="response-viewer" extends="observatory-element">
   <template>
-    <template repeat="{{ message in app.requestManager.responses }}">
-      <message-viewer app="{{ app }}" message="{{ message }}"></message-viewer>
-    </template>
+    <message-viewer app="{{ app }}" message="{{ app.response }}"></message-viewer>
   </template>
   
 </polymer-element><polymer-element name="observatory-application" extends="observatory-element">
   <template>
-    <template if="{{ app.locationManager.profile }}">
-      <isolate-profile app="{{ app }}"></isolate-profile>
-    </template>
-    <template if="{{ app.locationManager.profile == false }}">
-      <response-viewer app="{{ app }}"></response-viewer>
-    </template>
+    <response-viewer app="{{ app }}"></response-viewer>
   </template>
   
 </polymer-element>
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 81b6ad1..c1683ab 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
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAp:"__$library",gAu:"__$cls",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDF:"requestManager",gF0:"__$cls",gF8:"__$instruction",gGQ:"_newPieDataTable",gGV:"__$expanded",gGj:"_message",gHX:"__$displayValue",gHm:"tree",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",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:"__$trace",gVa:"__$frame",gWT:"rows",gX3:"_first",gXR:"scripts",gXh:"__$instance",gYu:"address",gZ0:"codes",gZ6:"locationManager",gZ8:"__$function",gZC:"__$anchor",ga:"a",gb:"b",gbV:"_combinedDataTable",gc:"c",geJ:"__$code",geb:"__$json",gfb:"methodCounts",ghm:"__$app",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkf:"_count",gm0:"__$isolate",gm7:"machine",gnI:"isolateManager",gnx:"__$callback",goH:"columns",gq3:"_fullChart",gqO:"_id",gqY:"__$topExclusiveCodes",grU:"__$callback",gtT:"code",gtY:"__$ref",gvH:"index",gvR:"_combinedChart",gva:"instructions",gvt:"__$field",gwd:"children",gyt:"depth",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",pC:"ACCUMULATED",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
+;init.mangledNames={gAp:"__$library",gAu:"__$cls",gBW:"__$msg",gCO:"_oldPieChart",gF0:"__$cls",gGQ:"_newPieDataTable",gGV:"__$expanded",gGj:"_message",gHX:"__$displayValue",gHm:"tree",gHu:"__$busy",gJ0:"_newPieChart",gJh:"__$vm",gJo:"__$last",gKM:"$",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPy:"__$error",gRd:"line",gSB:"__$active",gSS:"__$methodCountSelected",gSw:"lines",gUp:"__$trace",gUy:"_collapsed",gUz:"__$script",gVa:"__$frame",gWT:"rows",gX3:"_first",gXR:"scripts",gXh:"__$instance",gYu:"address",gZ0:"codes",gZ6:"locationManager",gZ8:"__$function",gZC:"__$anchor",ga:"a",gah:"__$app",gb:"b",gbV:"_combinedDataTable",geH:"__$sampleCount",geJ:"__$code",geb:"__$json",gfb:"methodCounts",gi2:"isolates",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm0:"__$instruction",gm7:"machine",gnx:"__$callback",goH:"columns",gpC:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqY:"__$topExclusiveCodes",grU:"__$callback",gtT:"code",gtY:"__$ref",guy:"__$link",gvH:"index",gva:"instructions",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={DI:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",b7:"ALLOCATED_BEFORE_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",pC:"ACCUMULATED",r1K:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8825,7 +8825,7 @@
 if(typeof z!=="number")return z.g()
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"call$1","Tj",2,0,null,11,[]],
+return y[x]},"call$1","eh",2,0,null,11,[]],
 Nq:[function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
@@ -8839,7 +8839,7 @@
 n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,104,[]],
 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,328,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 $isGv:true,
 "%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
@@ -8876,21 +8876,21 @@
 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","gRI",2,0,null,124,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,110,[]],
+return!0}return!1},"call$1","gRI",2,0,null,129,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,115,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,329,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,332,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,110,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,110,[]],
+aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,115,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
 zV:[function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
 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","gnr",0,2,null,330,331,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,289,[]],
+y[x]=w}return y.join(b)},"call$1","gnr",0,2,null,333,334,[]],
+eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,292,[]],
 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,47,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
@@ -8898,9 +8898,9 @@
 if(c==null)c=a.length
 else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(new P.AT(c))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,115,[],116,[]],
+return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
 Mu:[function(a,b,c){H.K0(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,115,[],116,[]],
+return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
@@ -8916,12 +8916,12 @@
 if(typeof c!=="number")return H.s(c)
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
-this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,115,[],116,[]],
-Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,110,[]],
+this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,120,[],121,[]],
+Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,115,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.ZE(a,0,a.length-1,b)},"call$1","gH7",0,2,null,77,128,[]],
-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,124,[],115,[]],
-Pk:[function(a,b,c){return H.eX(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,124,[],115,[]],
+H.ZE(a,0,a.length-1,b)},"call$1","gH7",0,2,null,77,133,[]],
+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,335,129,[],120,[]],
+Pk:[function(a,b,c){return H.eX(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
 return!1},"call$1","gdj",2,0,null,104,[]],
@@ -8932,7 +8932,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,"gRV",0,3,null,336,337,[]],
 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},
@@ -8976,11 +8976,11 @@
 if(this.gzP(a)===z)return 0
 if(this.gzP(a))return-1
 return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},"call$1","gYc",2,0,null,183,[]],
+return 1}else return-1},"call$1","gYc",2,0,null,188,[]],
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
 gx8:function(a){return isFinite(a)},
-JV:[function(a,b){return a%b},"call$1","gKG",2,0,null,183,[]],
+JV:[function(a,b){return a%b},"call$1","gKG",2,0,null,188,[]],
 yu:[function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
@@ -8992,7 +8992,7 @@
 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,338,[]],
 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,28,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
@@ -9013,7 +9013,7 @@
 if(b<0)return z-b
 else return z+b},"call$1","gQR",2,0,null,104,[]],
 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","gdG",2,0,null,104,[]],
+else return this.yu(a/b)},"call$1","guP",2,0,null,104,[]],
 cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,104,[]],
 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,104,[]],
@@ -9029,6 +9029,8 @@
 z=a>>z>>>0}return z},"call$1","gMe",2,0,null,104,[]],
 i:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return(a&b)>>>0},"call$1","gAU",2,0,null,104,[]],
+k:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return(a|b)>>>0},"call$1","gX9",2,0,null,104,[]],
 w:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return(a^b)>>>0},"call$1","gttE",2,0,null,104,[]],
 C:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -9054,17 +9056,17 @@
 $isnum:true},
 vT:{
 "^":"im;"},
-VP:{
+qa:{
 "^":"vT;"},
 BQ:{
-"^":"VP;"},
+"^":"qa;"},
 O:{
 "^":"String/Gv;",
 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,47,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,339,[]],
 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 +9077,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,26,[],115,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,335,26,[],120,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},"call$1","gF1n",2,0,null,104,[]],
 Tc:[function(a,b){var z,y
@@ -9083,13 +9085,13 @@
 y=a.length
 if(z>y)return!1
 return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,104,[]],
-h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gpd",4,0,null,105,[],106,[]],
+h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,105,[],106,[]],
 Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,98,[]],
 Qi:[function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string"){z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)}return J.I8(b,a,c)!=null},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,98,[],47,[]],
+return b===a.substring(c,z)}return J.I8(b,a,c)!=null},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,335,98,[],47,[]],
 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
@@ -9098,7 +9100,7 @@
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
 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,77,80,[],125,[]],
+return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,77,80,[],130,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
 bS:[function(a){var z,y,x,w,v
 for(z=a.length,y=0;y<z;){if(y>=z)H.vh(P.N(y))
@@ -9118,7 +9120,7 @@
 z=J.rY(b)
 if(typeof b==="object"&&b!==null&&!!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,98,[],115,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,98,[],120,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9129,10 +9131,10 @@
 x=c
 while(!0){if(typeof x!=="number")return x.F()
 if(!(x>=0))break
-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,"gph",2,2,null,77,98,[],115,[]],
+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,"gph",2,2,null,77,98,[],120,[]],
 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,104,[],80,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,335,104,[],80,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
@@ -9186,7 +9188,7 @@
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.ZV()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-return},"call$0","DU",0,0,null],
+return},"call$0","dY",0,0,null],
 ZV:[function(){var z,y
 z=new Error().stack
 if(z==null){z=(function() {try { throw new Error() } catch(e) { return e.stack }})()
@@ -9268,11 +9270,11 @@
 VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,21,[]],
 ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,21,[]],
 PK:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){this.a.call$1([])},"call$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:108;b",
+"^":"Tp:113;b",
 call$0:[function(){this.b.call$2([],null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
@@ -9297,7 +9299,7 @@
 aX:{
 "^":"a;jO>,Gx,fW,En<,EE<,Qy,RW<,C9<,lJ",
 v8:[function(a,b){if(!this.Qy.n(0,a))return
-if(this.lJ.h(0,b)&&!this.RW)this.RW=!0},"call$2","gfU",4,0,null,337,[],338,[]],
+if(this.lJ.h(0,b)&&!this.RW)this.RW=!0},"call$2","gfU",4,0,null,340,[],341,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9313,24 +9315,24 @@
 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}},"call$1","gtS",2,0,null,338,[]],
+y.qT=y.qT+1}this.RW=!1}},"call$1","gtS",2,0,null,341,[]],
 vV:[function(a){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
 try{y=a.call$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,136,[]],
+if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,141,[]],
 Ds:[function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
 default:P.JS("UNKOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,20,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,339,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,342,[]],
 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,339,[],340,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,342,[],343,[]],
 PC:[function(){var z=this.jO
 if(this.Gx.X5-this.fW.X5>0)init.globalState.i2.u(0,z,this)
 else init.globalState.i2.Rz(0,z)},"call$0","gi8",0,0,null],
@@ -9357,12 +9359,12 @@
 x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
-return!0},"call$0","gUB",0,0,null],
-Js:[function(){if($.Qm()!=null)new H.RA(this).call$0()
+return!0},"call$0","gad",0,0,null],
+oV:[function(){if($.Qm()!=null)new H.RA(this).call$0()
 else for(;this.xB(););},"call$0","gVY",0,0,null],
 bL:[function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.Js()
-else try{this.Js()}catch(x){w=H.Ru(x)
+if(init.globalState.EF!==!0)this.oV()
+else try{this.oV()}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 w=init.globalState.vd
@@ -9370,19 +9372,19 @@
 w.toString
 self.postMessage(v)}},"call$0","gcP",0,0,null]},
 RA:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;Aq*,i3,G1*",
 VU:[function(){if(this.Aq.gRW()){this.Aq.gC9().push(this)
-return}this.Aq.vV(this.i3)},"call$0","gjF",0,0,null],
+return}this.Aq.vV(this.i3)},"call$0","gbF",0,0,null],
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:108;a,b,c,d,e",
+"^":"Tp:113;a,b,c,d,e",
 call$0:[function(){var z,y,x,w,v,u
 z=this.a
 y=this.b
@@ -9427,7 +9429,7 @@
 $isZ6:true,
 $isbC:true},
 Ua:{
-"^":"Tp:108;a,b,c",
+"^":"Tp:113;a,b,c",
 call$0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -9465,11 +9467,11 @@
 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,341,[]],
+this.wy(b)},"call$1","gT5",2,0,null,344,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
-"^":"hz;CN,il",
+"^":"Dd;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,21,[]],
@@ -9499,7 +9501,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,[],342,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],345,[]],
 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
@@ -9508,7 +9510,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,[],342,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],345,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
 Xq:[function(){return},"call$0","gt6",0,0,null]},
 HU:{
@@ -9525,8 +9527,8 @@
 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.$isIU)return this.yf(a)
-return this.I9(a)},"call$1","gRQ",2,0,null,21,[]],
-I9:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,21,[]]},
+return this.YZ(a)},"call$1","gRQ",2,0,null,21,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,21,[]]},
 oo:{
 "^":"HU;",
 Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
@@ -9551,15 +9553,15 @@
 z.a=y
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
-return z.a},"call$1","gnM",2,0,null,144,[]],
+return z.a},"call$1","gnM",2,0,null,149,[]],
 DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,21,[]],
 yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,21,[]]},
 OW:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;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,42,[],204,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,42,[],211,[],"call"],
 $isEH:true},
-hz:{
+Dd:{
 "^":"HU;",
 Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
 wb:[function(a){var z,y
@@ -9575,7 +9577,7 @@
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,144,[]],
+return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,149,[]],
 mE:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
@@ -9628,7 +9630,7 @@
 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,21,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gec",2,0,null,21,[]]},
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,21,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
 ed:[function(){var z,y,x
@@ -9656,12 +9658,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:107;a,b",
+"^":"Tp:112;a,b",
 call$0:[function(){this.a.p9=null
 this.b.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:107;c,d",
+"^":"Tp:112;c,d",
 call$0:[function(){this.c.p9=null
 var z=init.globalState.Xz
 z.bZ=z.bZ-1
@@ -10234,7 +10236,7 @@
 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,42,[],204,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,42,[],211,[]],
 Rz:[function(a,b){return this.Ix()},"call$1","gRI",2,0,null,42,[]],
 V1:[function(a){return this.Ix()},"call$0","gyP",0,0,null],
 FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,104,[]],
@@ -10248,7 +10250,7 @@
 t:[function(a,b){if(typeof b!=="string")return
 if(!this.x4(b))return
 return this.HV[b]},"call$1","gIA",2,0,null,42,[]],
-aN:[function(a,b){J.kH(this.tc,new H.WT(this,b))},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){J.kH(this.tc,new H.WT(this,b))},"call$1","gjw",2,0,null,115,[]],
 gvc:function(a){return H.VM(new H.XR(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
@@ -10258,11 +10260,11 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 WT:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;a,b",
 call$1:[function(a){return this.b.call$2(a,this.a.t(0,a))},"call$1",null,2,0,null,42,[],"call"],
 $isEH:true},
 jJ:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,42,[],"call"],
 $isEH:true},
 XR:{
@@ -10332,7 +10334,7 @@
 C.Nm.FV(y,b)
 z=this.Ot
 z=z!=null?z:a
-b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,140,[],82,[]]},
+b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
 IW:{
 "^":"A2;qa,Pi,mr,eK,Ot",
 To:function(a){return this.qa.call$1(a)},
@@ -10351,25 +10353,25 @@
 else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
 else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
 for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)},"call$2","gUT",4,0,null,140,[],82,[]]},
+return this.mr.apply(v,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
 F3:{
-"^":"a;e0?",
+"^":"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,140,[],328,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,145,[],331,[]]},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM",
 BX:[function(a,b){var z=this.Rv
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,344,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,347,[]],
 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,345,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,348,[]],
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"t4,FV,C1,bt",zh:function(a){var z,y,x,w
+static:{"^":"t4,FV,C1,kj",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -10379,7 +10381,7 @@
 w=z[1]
 return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2])}}},
 Cj:{
-"^":"Tp:346;a,b,c",
+"^":"Tp:349;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
@@ -10387,10 +10389,10 @@
 z.a=z.a+1},"call$2",null,4,0,null,12,[],46,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:346;a,b",
+"^":"Tp:349;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,344,[],23,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,347,[],23,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10459,10 +10461,10 @@
 bu:[function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
-"^":"Tp:225;a",
+"^":"Tp:107;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
-return a},"call$1",null,2,0,null,155,[],"call"],
+return a},"call$1",null,2,0,null,160,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -10475,23 +10477,23 @@
 this.ui=z
 return z},"call$0","gXo",0,0,null]},
 dr:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return this.a.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:108;b,c",
+"^":"Tp:113;b,c",
 call$0:[function(){return this.b.call$1(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:108;d,e,f",
+"^":"Tp:113;d,e,f",
 call$0:[function(){return this.d.call$2(this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:108;UI,bK,Gq,Rm",
+"^":"Tp:113;UI,bK,Gq,Rm",
 call$0:[function(){return this.UI.call$3(this.bK,this.Gq,this.Rm)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:108;w3,HZ,mG,xC,cj",
+"^":"Tp:113;w3,HZ,mG,xC,cj",
 call$0:[function(){return this.w3.call$4(this.HZ,this.mG,this.xC,this.cj)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
@@ -10636,11 +10638,11 @@
 Lm:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:347;b",
+"^":"Tp:350;b",
 call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,91,[],94,[],"call"],
 $isEH:true},
 VX:{
@@ -10665,16 +10667,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,339,[]],
 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,339,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,339,[]],
 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,26,[],115,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,26,[],120,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10685,13 +10687,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,26,[],115,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,26,[],120,[]],
 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,26,[],115,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,335,26,[],120,[]],
 $isVR:true,
 $iscT:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10737,19 +10739,753 @@
 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,348,[]],
-$isOd:true}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+return this.zO},"call$1","gIA",2,0,null,351,[]],
+$isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/observatory_elements/observatory_element.dart","package:observatory/src/observatory_elements/nav_bar.dart","package:observatory/src/observatory_elements/breakpoint_list.dart","package:observatory/src/observatory_elements/service_ref.dart","package:observatory/src/observatory_elements/class_ref.dart","package:observatory/src/observatory_elements/error_view.dart","package:observatory/src/observatory_elements/field_ref.dart","package:observatory/src/observatory_elements/function_ref.dart","package:observatory/src/observatory_elements/curly_block.dart","package:observatory/src/observatory_elements/instance_ref.dart","package:observatory/src/observatory_elements/library_ref.dart","package:observatory/src/observatory_elements/class_view.dart","package:observatory/src/observatory_elements/code_ref.dart","package:observatory/src/observatory_elements/disassembly_entry.dart","package:observatory/src/observatory_elements/code_view.dart","package:observatory/src/observatory_elements/collapsible_content.dart","package:observatory/src/observatory_elements/field_view.dart","package:observatory/src/observatory_elements/function_view.dart","package:observatory/src/observatory_elements/script_ref.dart","package:observatory/src/observatory_elements/isolate_summary.dart","package:observatory/src/observatory_elements/isolate_list.dart","package:observatory/src/observatory_elements/instance_view.dart","package:observatory/src/observatory_elements/json_view.dart","package:observatory/src/observatory_elements/library_view.dart","package:observatory/src/observatory_elements/heap_profile.dart","package:observatory/src/observatory_elements/script_view.dart","package:observatory/src/observatory_elements/stack_frame.dart","package:observatory/src/observatory_elements/stack_trace.dart","package:observatory/src/observatory_elements/message_viewer.dart","package:observatory/src/observatory_elements/isolate_profile.dart","package:observatory/src/observatory_elements/response_viewer.dart","package:observatory/src/observatory_elements/observatory_application.dart","main.dart"]
+m7:[function(a){var z
+N.Jx("").To("Google Charts API loaded")
+z=J.UQ(J.UQ($.cM(),"google"),"visualization")
+$.NR=z
+return z},"call$1","vN",2,0,107,108,[]],
+js:[function(a,b){return J.pb(b,new G.BO(a))},"call$2","o4",4,0,null,110,[],111,[]],
+mL:{
+"^":["Pi;Z6<-352,zf>-353,AJ,Eb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gn9:[function(a){return this.AJ},null,null,1,0,354,"response",355,356],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,357,23,[],"response",355],
+gAq:[function(a){return this.Eb},null,null,1,0,358,"isolate",355,356],
+sAq:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,359,23,[],"isolate",355],
+Ww:[function(a,b){var z=H.B7(["type","Error","errorType",b,"text",a],P.L5(null,null,null,null,null))
+z=R.Jk(z)
+this.AJ=F.Wi(this,C.mE,this.AJ,z)
+N.Jx("").hh(a)},function(a){return this.Ww(a,"ResponseError")},"AI","call$2",null,"gug",2,2,null,360,20,[],361,[]],
+TR:[function(){this.zf.sec(this)
+var z=this.Z6
+z.sec(this)
+z.kI()},"call$0","gIo",0,0,null],
+US:function(){this.TR()},
+hq:function(){this.TR()},
+static:{"^":"Tj,pQ"}},
+Kf:{
+"^":"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,[],362,[]],
+lb:[function(){var z=this.Yb
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gGL",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,363,[]]},
+qu:{
+"^":"a;vR,bG>",
+u5:[function(){var z,y,x
+z=this.vR.nQ("getSortInfo")
+if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
+x=J.U6(z)
+y.u(0,"sortColumn",x.t(z,"column"))
+y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gIK",0,0,null],
+W2:[function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.gYb(),z])},"call$1","gW8",2,0,null,186,[]]},
+bv:{
+"^":["Pi;zf>,rI,we,jF,XR<-364,Z0<-365,hI,am,y6,c8,LE<-366,qU,yg,YG,jy,AP,fn",null,null,null,null,function(){return[C.mI]},function(){return[C.mI]},null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
+gAq:function(a){return this},
+gPj:function(a){return this.rI},
+gjO:function(a){return this.rI},
+zr:[function(a){return this.zf.Sl(this.rI).ml(new G.eS(this)).ml(new G.IQ(this))},"call$0","gvC",0,0,null],
+Mq:[function(a){return H.d(this.rI)+"/"+H.d(a)},"call$1","gLc",2,0,367,109,[],"relativeLink",355],
+rn:[function(a){return"#/"+(H.d(this.rI)+"/"+H.d(a))},"call$1","gHP",2,0,367,109,[],"hashLink",355],
+gB1:[function(a){return this.jF},null,null,1,0,368,"profile",355,356],
+sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,369,23,[],"profile",355],
+goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
+soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
+gzz:[function(){return this.am},null,null,1,0,370,"vmName",355,356],
+szz:[function(a){this.am=F.Wi(this,C.KS,this.am,a)},null,null,3,0,25,23,[],"vmName",355],
+gw2:[function(){return this.y6},null,null,1,0,354,"entry",355,356],
+sw2:[function(a){this.y6=F.Wi(this,C.tP,this.y6,a)},null,null,3,0,357,23,[],"entry",355],
+gVc:[function(){return this.c8},null,null,1,0,370,"rootLib",355,356],
+sVc:[function(a){this.c8=F.Wi(this,C.iF,this.c8,a)},null,null,3,0,25,23,[],"rootLib",355],
+gCi:[function(){return this.qU},null,null,1,0,371,"newHeapUsed",355,356],
+sCi:[function(a){this.qU=F.Wi(this,C.IO,this.qU,a)},null,null,3,0,372,23,[],"newHeapUsed",355],
+guq:[function(){return this.yg},null,null,1,0,371,"oldHeapUsed",355,356],
+suq:[function(a){this.yg=F.Wi(this,C.ap,this.yg,a)},null,null,3,0,372,23,[],"oldHeapUsed",355],
+gUu:[function(){return this.YG},null,null,1,0,354,"topFrame",355,356],
+sUu:[function(a){this.YG=F.Wi(this,C.ch,this.YG,a)},null,null,3,0,357,23,[],"topFrame",355],
+gNh:[function(a){return this.jy},null,null,1,0,370,"fileAndLine",355,356],
+bj:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.jy=F.Wi(this,C.SK,this.jy,b)},null,null,3,0,25,23,[],"fileAndLine",355],
+eC:[function(a){var z,y,x,w
+z=J.U6(a)
+if(!J.de(z.t(a,"type"),"Isolate")){N.Jx("").hh("Unexpected message type in Isolate.update: "+H.d(z.t(a,"type")))
+return}if(z.t(a,"rootLib")==null||z.t(a,"timers")==null||z.t(a,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(a))
+return}y=J.UQ(z.t(a,"rootLib"),"id")
+this.c8=F.Wi(this,C.iF,this.c8,y)
+y=z.t(a,"name")
+this.am=F.Wi(this,C.KS,this.am,y)
+if(z.t(a,"entry")!=null){y=z.t(a,"entry")
+y=F.Wi(this,C.tP,this.y6,y)
+this.y6=y
+y=J.UQ(y,"name")
+this.hI=F.Wi(this,C.YS,this.hI,y)}else this.hI=F.Wi(this,C.YS,this.hI,"root isolate")
+if(z.t(a,"topFrame")!=null){y=z.t(a,"topFrame")
+this.YG=F.Wi(this,C.ch,this.YG,y)}x=H.B7([],P.L5(null,null,null,null,null))
+J.kH(z.t(a,"timers"),new G.TI(x))
+y=this.LE
+w=J.w1(y)
+w.u(y,"total",x.t(0,"time_total_runtime"))
+w.u(y,"compile",x.t(0,"time_compilation"))
+w.u(y,"gc",0)
+w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
+w.u(y,"dart",x.t(0,"time_dart_execution"))
+y=J.UQ(z.t(a,"heap"),"usedNew")
+this.qU=F.Wi(this,C.IO,this.qU,y)
+z=J.UQ(z.t(a,"heap"),"usedOld")
+this.yg=F.Wi(this,C.ap,this.yg,z)},"call$1","gpn",2,0,null,149,[]],
+bu:[function(a){return H.d(this.rI)},"call$0","gXo",0,0,null],
+hv:[function(a){var z,y,x,w
+z=this.Z0
+y=J.U6(z)
+x=0
+while(!0){w=y.gB(z)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+if(J.kE(y.t(z,x),a)===!0)return y.t(z,x);++x}return},"call$1","gER",2,0,null,373,[]],
+R7:[function(){var z,y,x,w
+N.Jx("").To("Reset all code ticks.")
+z=this.Z0
+y=J.U6(z)
+x=0
+while(!0){w=y.gB(z)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+y.t(z,x).FB();++x}},"call$0","gve",0,0,null],
+oe:[function(a){var z,y,x,w,v,u,t
+for(z=J.GP(a),y=this.XR,x=J.U6(y);z.G();){w=z.gl()
+v=J.U6(w)
+u=J.UQ(v.t(w,"script"),"id")
+t=x.t(y,u)
+if(t==null){t=G.Ak(v.t(w,"script"))
+x.u(y,u,t)}t.hC(v.t(w,"hits"))}},"call$1","gHY",2,0,null,374,[]],
+tx:[function(a,b,c){var z,y,x
+z=H.B7(["type",a,b,c],P.L5(null,null,null,null,null))
+y=this.zf.ec
+y.toString
+x=R.Jk(z)
+y.AJ=F.Wi(y,C.mE,y.AJ,x)},"call$3","gmk",6,0,null,11,[],375,[],285,[]],
+XT:[function(a,b){var z,y,x
+z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isew){z=W.qc(a.target)
+y=J.RE(z)
+x=H.d(y.gys(z))+" "+y.gpo(z)
+if(y.gys(z)===0)x="No service found. Did you run with --enable-vm-service ?"
+this.zf.ec.Ww(x,"RequestError")}else this.zf.ec.AI(H.d(a)+" "+H.d(b))},"call$2","gdT",4,0,376,18,[],377,[]],
+n1:[function(a){var z,y,x
+z=G.Ep(a)
+y=J.x(z)
+if(y.n(z,0)){this.zf.ec.AI(a+" is not a valid code request.")
+return}x=this.hv(z)
+if(x!=null){N.Jx("").To("Found code with 0x"+y.WZ(z,16)+" in isolate.")
+this.tx("Code","code",x)
+return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.at(this,z)).OA(this.gdT())},"call$1","gN8",2,0,null,109,[]],
+PL:[function(a){var z,y
+z=J.UQ(this.XR,a)
+y=z!=null
+if(y&&!z.giI()){N.Jx("").To("Found script "+H.d(J.UQ(z.gKC(),"name"))+" in isolate")
+this.tx("Script","script",z)
+return}if(y){this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.wu(this,z))
+return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.Vc(this,a))},"call$1","gdk",2,0,null,109,[]],
+ox:[function(a){var z,y
+z=$.Ks().Ej
+y=typeof a!=="string"
+if(y)H.vh(new P.AT(a))
+if(z.test(a)){this.n1(a)
+return}z=$.hK().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a)){this.PL(a)
+return}return this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.KQ(this,a))},"call$1","gVw",2,0,null,109,[]],
+oX:[function(a){return this.zf.Sl(H.d(this.rI)+"/"+H.d(a))},"call$1","guZ",2,0,null,109,[]],
+$isd3:true,
+static:{"^":"rC,lF",Ep:[function(a){var z,y,x,w,v,u
+z=$.Ks().R4(0,a)
+if(z==null)return 0
+try{x=z.gQK().input
+w=z
+v=w.gQK().index
+w=w.gQK()
+if(0>=w.length)return H.e(w,0)
+w=J.q8(w[0])
+if(typeof w!=="number")return H.s(w)
+y=H.BU(C.xB.yn(x,v+w),16,null)
+return y}catch(u){H.Ru(u)
+return 0}},"call$1","VP",2,0,null,109,[]]}},
+eS:{
+"^":"Tp:107;a",
+call$1:[function(a){return this.a.eC(a)},"call$1",null,2,0,null,191,[],"call"],
+$isEH:true},
+IQ:{
+"^":"Tp:107;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
+$isEH:true},
+TI:{
+"^":"Tp:107;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,378,[],"call"],
+$isEH:true},
+at:{
+"^":"Tp:107;a,b",
+call$1:[function(a){var z,y,x,w,v
+z=R.Jk([])
+y=H.B7([],P.L5(null,null,null,null,null))
+y=R.Jk(y)
+x=H.B7([],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+w=J.U6(a)
+v=new G.kx(C.l8,H.BU(w.t(a,"start"),16,null),H.BU(w.t(a,"end"),16,null),[],[],[],0,0,z,y,x,null,null,null,null)
+v.NV(a)
+N.Jx("").To("Added code with 0x"+J.u1(this.b,16)+" to isolate.")
+x=this.a
+J.bi(x.Z0,v)
+x.tx("Code","code",v)},"call$1",null,2,0,null,149,[],"call"],
+$isEH:true},
+wu:{
+"^":"Tp:107;a,b",
+call$1:[function(a){var z=this.b
+z.qi(J.UQ(a,"source"))
+N.Jx("").To("Grabbed script "+H.d(J.UQ(z.gKC(),"name"))+" source.")
+this.a.tx("Script","script",z)},"call$1",null,2,0,null,379,[],"call"],
+$isEH:true},
+Vc:{
+"^":"Tp:107;c,d",
+call$1:[function(a){var z,y
+z=G.Ak(a)
+N.Jx("").To("Added script "+H.d(J.UQ(z.VG,"name"))+" to isolate.")
+y=this.c
+y.tx("Script","script",z)
+J.kW(y.XR,this.d,z)},"call$1",null,2,0,null,379,[],"call"],
+$isEH:true},
+KQ:{
+"^":"Tp:107;a,b",
+call$1:[function(a){var z,y
+z=this.a
+y=J.U6(a)
+y=new G.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,y.t(a,"id"),y.t(a,"type"),null,null,null,null)
+y.wp(z,a)
+return y},"call$1",null,2,0,null,191,[],"call"],
+$isEH:true},
+dZ:{
+"^":"Pi;ec?,jF,JL,MU,AP,fn",
+guw:function(a){return this.ec},
+gB1:[function(a){return this.jF},null,null,1,0,380,"profile",355,356],
+sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,381,23,[],"profile",355],
+gjW:[function(){return this.JL},null,null,1,0,370,"currentHash",355,356],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,25,23,[],"currentHash",355],
+gXX:[function(){return this.MU},null,null,1,0,382,"currentHashUri",355,356],
+sXX:[function(a){this.MU=F.Wi(this,C.tv,this.MU,a)},null,null,3,0,383,23,[],"currentHashUri",355],
+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],
+vI:[function(){var z,y,x,w,v
+z=$.oy().R4(0,this.JL)
+if(z==null)return
+y=z.QK
+x=y.input
+w=y.index
+v=y.index
+if(0>=y.length)return H.e(y,0)
+y=J.q8(y[0])
+if(typeof y!=="number")return H.s(y)
+return C.xB.Nj(x,w,v+y)},"call$0","gzJ",0,0,null],
+V4:[function(){var z,y,x,w
+z=$.oy().R4(0,this.JL)
+if(z==null)return
+y=z.QK
+x=y.input
+w=y.index
+if(0>=y.length)return H.e(y,0)
+y=J.q8(y[0])
+if(typeof y!=="number")return H.s(y)
+return C.xB.yn(x,w+y)},"call$0","gdQ",0,0,null],
+gwB:[function(){return this.vI()!=null},null,null,1,0,380,"hasCurrentIsolate",356],
+R6:[function(){var z=this.vI()
+if(z==null)return""
+return J.D8(z,2)},"call$0","gKo",0,0,null],
+Pr:[function(){var z=this.R6()
+if(z==="")return
+return this.ec.zf.AQ(z)},"call$0","gjf",0,0,358,"currentIsolate",356],
+S7:[function(){var z=J.Co(C.ol.gmW(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/")
+return!0}return!1},"call$0","goO",0,0,null],
+df:[function(){var z,y,x,w
+z=J.Co(C.ol.gmW(window))
+z=F.Wi(this,C.h1,this.JL,z)
+this.JL=z
+y=J.D8(z,1)
+z=this.ec
+x=this.Pr()
+z.Eb=F.Wi(z,C.Z8,z.Eb,x)
+x=P.r6($.qG().ej(y))
+this.MU=F.Wi(this,C.tv,this.MU,x)
+if(this.ec.Eb==null){N.Jx("").j2("Refreshing isolates.")
+this.ec.zf.r3()
+return}w=this.V4()
+N.Jx("").To("Asking "+H.d(J.F8(this.ec.Eb))+" for "+w)
+this.ec.Eb.ox(w).ml(new G.GH(this))},"call$0","glq",0,0,null],
+static:{"^":"x4,Qq,qY"}},
+Qe:{
+"^":"Tp:107;a",
+call$1:[function(a){var z=this.a
+if(z.S7())return
+F.Wi(z,C.D2,z.vI()==null,z.vI()!=null)
+z.df()},"call$1",null,2,0,null,384,[],"call"],
+$isEH:true},
+GH:{
+"^":"Tp:107;a",
+call$1:[function(a){var z=this.a.ec
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1",null,2,0,null,385,[],"call"],
+$isEH:true},
+Q4:{
+"^":["Pi;Yu<-386,m7<-387,L4<-387,NC,xb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+ga0:[function(){return this.NC},null,null,1,0,371,"ticks",355,356],
+sa0:[function(a){this.NC=F.Wi(this,C.p1,this.NC,a)},null,null,3,0,372,23,[],"ticks",355],
+gGK:[function(){return this.xb},null,null,1,0,388,"percent",355,356],
+sGK:[function(a){this.xb=F.Wi(this,C.tI,this.xb,a)},null,null,3,0,389,23,[],"percent",355],
+oS:[function(){var z=this.xb
+if(z==null||J.Hb(z,0))return""
+return J.Ez(this.xb,2)+"% ("+H.d(this.NC)+")"},"call$0","gu3",0,0,370,"formattedTicks",356],
+xt:[function(){return"0x"+J.u1(this.Yu,16)},"call$0","gDa",0,0,370,"formattedAddress",356]},
+WAE:{
+"^":"a;Zd",
+bu:[function(a){return"CodeKind."+this.Zd},"call$0","gXo",0,0,null],
+static:{"^":"r1,pg,WAg",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
+throw H.b(P.hS())},"call$1","Tx",2,0,null,86,[]]}},
+N8:{
+"^":"a;Yu<,pO,Iw"},
+Vi:{
+"^":"a;tT>,Av<"},
+kx:{
+"^":["Pi;fY>,vg,Mb,a0<,VS<,hw,fF<,Du<,va<-390,tQ,Ge,hI,HJ,AP,fn",null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
+gkx:[function(){return this.tQ},null,null,1,0,354,"functionRef",355,356],
+skx:[function(a){this.tQ=F.Wi(this,C.yg,this.tQ,a)},null,null,3,0,357,23,[],"functionRef",355],
+gZN:[function(){return this.Ge},null,null,1,0,354,"codeRef",355,356],
+sZN:[function(a){this.Ge=F.Wi(this,C.EX,this.Ge,a)},null,null,3,0,357,23,[],"codeRef",355],
+goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
+soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
+giK:[function(){return this.HJ},null,null,1,0,370,"userName",355,356],
+siK:[function(a){this.HJ=F.Wi(this,C.ct,this.HJ,a)},null,null,3,0,25,23,[],"userName",355],
+R3:[function(a,b){var z,y,x,w,v,u,t
+z=J.U6(b)
+this.fF=H.BU(z.t(b,"inclusive_ticks"),null,null)
+this.Du=H.BU(z.t(b,"exclusive_ticks"),null,null)
+y=z.t(b,"ticks")
+if(y!=null&&J.z8(J.q8(y),0)){z=J.U6(y)
+x=this.a0
+w=0
+while(!0){v=z.gB(y)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=H.BU(z.t(y,w),16,null)
+t=H.BU(z.t(y,w+1),null,null)
+x.push(new G.N8(u,H.BU(z.t(y,w+2),null,null),t))
+w+=3}}},"call$1","gOT",2,0,null,149,[]],
+QQ:[function(){return this.uL(this.VS)},"call$0","gyj",0,0,null],
+dJ:[function(a){return this.KU(this.VS,a)},"call$1","gf7",2,0,null,141,[]],
+uL:[function(a){var z,y,x
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]),y=0;z.G();){x=z.lo.gAv()
+if(typeof x!=="number")return H.s(x)
+y+=x}return y},"call$1","grr",2,0,null,391,[]],
+KU:[function(a,b){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(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gKZ",4,0,null,391,[],141,[]],
+xF:[function(a,b){var z=J.U6(a)
+this.lC(this.VS,z.t(a,"callers"),b)
+this.lC(this.hw,z.t(a,"callees"),b)},"call$2","gL0",4,0,null,141,[],392,[]],
+lC:[function(a,b,c){var z,y,x,w,v
+C.Nm.sB(a,0)
+z=J.U6(b)
+y=0
+while(!0){x=z.gB(b)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+w=H.BU(z.t(b,y),null,null)
+v=H.BU(z.t(b,y+1),null,null)
+if(w>>>0!==w||w>=c.length)return H.e(c,w)
+a.push(new G.Vi(c[w],v))
+y+=2}H.ZE(a,0,a.length-1,new G.fx())},"call$3","gPG",6,0,null,391,[],239,[],392,[]],
+FB:[function(){this.fF=0
+this.Du=0
+C.Nm.sB(this.a0,0)
+for(var z=J.GP(this.va);z.G();)z.gl().sa0(0)},"call$0","gNB",0,0,null],
+iv:[function(a){var z,y,x,w,v
+z=this.va
+y=J.w1(z)
+y.V1(z)
+x=J.U6(a)
+w=0
+while(!0){v=x.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+c$0:{if(J.de(x.t(a,w),""))break c$0
+y.h(z,new G.Q4(H.BU(x.t(a,w),null,null),x.t(a,w+1),x.t(a,w+2),0,null,null,null))}w+=3}},"call$1","goU",2,0,null,393,[]],
+tg:[function(a,b){var z=J.Wx(b)
+return z.F(b,this.vg)&&z.C(b,this.Mb)},"call$1","gdj",2,0,null,373,[]],
+NV:function(a){var z,y
+z=J.U6(a)
+y=z.t(a,"function")
+y=R.Jk(y)
+this.tQ=F.Wi(this,C.yg,this.tQ,y)
+y=R.Jk(a)
+this.Ge=F.Wi(this,C.EX,this.Ge,y)
+y=z.t(a,"name")
+this.hI=F.Wi(this,C.YS,this.hI,y)
+y=z.t(a,"user_name")
+this.HJ=F.Wi(this,C.ct,this.HJ,y)
+if(z.t(a,"disassembly")!=null)this.iv(z.t(a,"disassembly"))},
+$iskx:true},
+fx:{
+"^":"Tp:346;",
+call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,128,[],188,[],"call"],
+$isEH:true},
+CM:{
+"^":"a;Aq>,tm,hV<",
+j8:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+z=J.U6(a)
+if(!J.de(z.t(a,"type"),"ProfileCode"))return
+y=this.Aq
+x=y.hv(H.BU(J.UQ(z.t(a,"code"),"start"),16,null))
+if(x==null){w=G.CQ(z.t(a,"kind"))
+v=z.t(a,"code")
+z=J.U6(v)
+u=H.BU(z.t(v,"start"),16,null)
+t=H.BU(z.t(v,"end"),16,null)
+s=z.t(v,"name")
+r=z.t(v,"user_name")
+q=R.Jk([])
+p=H.B7([],P.L5(null,null,null,null,null))
+p=R.Jk(p)
+o=H.B7([],P.L5(null,null,null,null,null))
+o=R.Jk(o)
+x=new G.kx(w,u,t,[],[],[],0,0,q,p,o,s,null,null,null)
+x.Ge=F.Wi(x,C.EX,o,v)
+o=z.t(v,"function")
+q=R.Jk(o)
+x.tQ=F.Wi(x,C.yg,x.tQ,q)
+x.HJ=F.Wi(x,C.ct,x.HJ,r)
+if(z.t(v,"disassembly")!=null){x.iv(z.t(v,"disassembly"))
+z.u(v,"disassembly",null)}J.bi(y.gZ0(),x)}J.JD(x,a)
+this.tm.push(x)},"call$1","gWF",2,0,null,394,[]],
+T0:[function(a){var z,y
+z=this.Aq.gZ0()
+y=J.w1(z)
+y.GT(z,new G.vu())
+if(J.u6(y.gB(z),a)||J.de(a,0))return z
+return y.D6(z,0,a)},"call$1","gmZ",2,0,null,127,[]],
+uH:function(a,b){var z,y,x,w,v
+z=J.U6(b)
+y=z.t(b,"codes")
+this.hV=z.t(b,"samples")
+z=J.U6(y)
+N.Jx("").To("Creating profile from "+H.d(this.hV)+" samples and "+H.d(z.gB(y))+" code objects.")
+this.Aq.R7()
+x=this.tm
+C.Nm.sB(x,0)
+z.aN(y,new G.xn(this))
+w=0
+while(!0){v=z.gB(y)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+if(w>=x.length)return H.e(x,w)
+x[w].xF(z.t(y,w),x);++w}C.Nm.sB(x,0)},
+static:{hh:function(a,b){var z=new G.CM(a,H.VM([],[G.kx]),0)
+z.uH(a,b)
+return z}}},
+xn:{
+"^":"Tp:107;a",
+call$1:[function(a){var z,y,x,w
+try{this.a.j8(a)}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+N.Jx("").wF("Error processing code object. "+H.d(z)+" "+H.d(y),z,y)}},"call$1",null,2,0,null,141,[],"call"],
+$isEH:true},
+vu:{
+"^":"Tp:395;",
+call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,128,[],188,[],"call"],
+$isEH:true},
+c2:{
+"^":["Pi;Rd>-386,ye,i0,AP,fn",function(){return[C.mI]},null,null,null,null],
+gu9:[function(){return this.ye},null,null,1,0,371,"hits",355,356],
+su9:[function(a){this.ye=F.Wi(this,C.K7,this.ye,a)},null,null,3,0,372,23,[],"hits",355],
+ga4:[function(a){return this.i0},null,null,1,0,370,"text",355,356],
+sa4:[function(a,b){this.i0=F.Wi(this,C.MB,this.i0,b)},null,null,3,0,25,23,[],"text",355],
+goG:function(){return J.J5(this.ye,0)},
+gVt:function(){return J.z8(this.ye,0)},
+$isc2:true},
+rj:{
+"^":["Pi;I2,VG,pw,tq,Sw<-396,iA,AP,fn",null,null,null,null,function(){return[C.mI]},null,null,null],
+gfY:[function(a){return this.I2},null,null,1,0,370,"kind",355,356],
+sfY:[function(a,b){this.I2=F.Wi(this,C.fy,this.I2,b)},null,null,3,0,25,23,[],"kind",355],
+gKC:[function(){return this.VG},null,null,1,0,354,"scriptRef",355,356],
+sKC:[function(a){this.VG=F.Wi(this,C.Be,this.VG,a)},null,null,3,0,357,23,[],"scriptRef",355],
+gQT:[function(){return this.pw},null,null,1,0,370,"shortName",355,397],
+sQT:[function(a){this.pw=F.Wi(this,C.Kt,this.pw,a)},null,null,3,0,25,23,[],"shortName",355],
+gBi:[function(){return this.tq},null,null,1,0,354,"libraryRef",355,356],
+sBi:[function(a){this.tq=F.Wi(this,C.cg,this.tq,a)},null,null,3,0,357,23,[],"libraryRef",355],
+giI:function(){return this.iA},
+gHh:[function(){return J.Pr(this.Sw,1)},null,null,1,0,398,"linesForDisplay",356],
+H2:[function(a){var z,y,x,w
+z=this.Sw
+y=J.U6(z)
+x=J.Wx(a)
+if(x.F(a,y.gB(z)))y.sB(z,x.g(a,1))
+w=y.t(z,a)
+if(w==null){w=new G.c2(a,-1,"",null,null)
+y.u(z,a,w)}return w},"call$1","git",2,0,null,399,[]],
+qi:[function(a){var z,y,x,w
+if(a==null)return
+N.Jx("").To("Loading source for "+H.d(J.UQ(this.VG,"name")))
+z=J.uH(a,"\n")
+this.iA=z.length===0
+for(y=0;y<z.length;y=x){x=y+1
+w=this.H2(x)
+if(y>=z.length)return H.e(z,y)
+J.c9(w,z[y])}},"call$1","gUe",2,0,null,27,[]],
+hC:[function(a){var z,y,x
+z=J.U6(a)
+y=0
+while(!0){x=z.gB(a)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+this.H2(z.t(a,y)).su9(z.t(a,y+1))
+y+=2}F.Wi(this,C.C2,"","("+C.CD.yM(this.Nk(),1)+"% covered)")},"call$1","geL",2,0,null,400,[]],
+Nk:[function(){var z,y,x,w
+for(z=J.GP(this.Sw),y=0,x=0;z.G();){w=z.gl()
+if(w==null)continue
+if(!w.goG())continue;++x
+if(!w.gVt())continue;++y}if(x===0)return 0
+return y/x*100},"call$0","gUO",0,0,388,"coveredPercentage",356],
+Jt:[function(){return"("+C.CD.yM(this.Nk(),1)+"% covered)"},"call$0","gic",0,0,370,"coveredPercentageFormatted",356],
+Ea:function(a){var z,y
+z=J.U6(a)
+y=H.B7(["id",z.t(a,"id"),"name",z.t(a,"name"),"user_name",z.t(a,"user_name")],P.L5(null,null,null,null,null))
+y=R.Jk(y)
+this.VG=F.Wi(this,C.Be,this.VG,y)
+y=J.D8(z.t(a,"name"),J.WB(J.eJ(z.t(a,"name"),"/"),1))
+this.pw=F.Wi(this,C.Kt,this.pw,y)
+y=z.t(a,"library")
+y=R.Jk(y)
+this.tq=F.Wi(this,C.cg,this.tq,y)
+y=z.t(a,"kind")
+this.I2=F.Wi(this,C.fy,this.I2,y)
+this.qi(z.t(a,"source"))},
+$isrj:true,
+static:{Ak:function(a){var z,y,x
+z=H.B7([],P.L5(null,null,null,null,null))
+z=R.Jk(z)
+y=H.B7([],P.L5(null,null,null,null,null))
+y=R.Jk(y)
+x=H.VM([],[G.c2])
+x=R.Jk(x)
+x=new G.rj(null,z,null,y,x,!0,null,null)
+x.Ea(a)
+return x}}},
+af:{
+"^":"d3;Aq>",
+gPj:function(a){return H.d(this.Aq.rI)+"/"+H.d(this.rI)},
+gjO:function(a){return this.rI}},
+SI:{
+"^":"af;YY,Aq,rI,we,R9,wv,V2,me",
+zr:[function(a){var z=this.Aq
+z.zf.Sl(H.d(z.rI)+"/"+H.d(this.rI)).ml(this.gE7())
+return P.Ab(this,null)},"call$0","gvC",0,0,null],
+Tn:[function(a){var z=this.YY
+z.V1(0)
+z.FV(0,a)},"call$1","gE7",2,0,401,191,[]],
+FV:[function(a,b){return this.YY.FV(0,b)},"call$1","gDY",2,0,null,104,[]],
+V1:[function(a){return this.YY.V1(0)},"call$0","gyP",0,0,null],
+di:[function(a){return this.YY.Zp.di(a)},"call$1","gmc",2,0,null,277,[]],
+x4:[function(a){return this.YY.Zp.x4(a)},"call$1","gV9",2,0,null,402,[]],
+aN:[function(a,b){return this.YY.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+Rz:[function(a,b){return this.YY.Rz(0,b)},"call$1","gRI",2,0,null,42,[]],
+t:[function(a,b){return this.YY.Zp.t(0,b)},"call$1","gIA",2,0,null,402,[]],
+u:[function(a,b,c){this.YY.u(0,b,c)
+return c},"call$2","gj3",4,0,null,402,[],277,[]],
+gl0:function(a){var z=this.YY.Zp
+return z.gB(z)===0},
+gor:function(a){var z=this.YY.Zp
+return z.gB(z)!==0},
+gvc:function(a){var z=this.YY.Zp
+return z.gvc(z)},
+gUQ:function(a){var z=this.YY.Zp
+return z.gUQ(z)},
+gB:function(a){var z=this.YY.Zp
+return z.gB(z)},
+wp:function(a,b){var z=this.YY
+z.V1(0)
+z.FV(0,b)},
+$isZ0:true,
+$asZ0:function(){return[null,null]}},
+Y2:{
+"^":["Pi;eT>,yt<-386,wd>-403,oH<-404",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
+if(z!==b)if(b)this.C4(0)
+else this.o8()},
+r8:[function(){this.soE(0,!this.z3)
+return this.z3},"call$0","gMk",0,0,null],
+$isY2:true},
+XN:{
+"^":["Pi;rO,WT>-403,AP,fn",null,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,405,[]],
+Mf:[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,406,[]],
+VE:[function(a){var z,y,x,w,v,u,t
+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,363,[]],
+PP:[function(a){var z,y,x,w,v
+z=J.RE(a)
+y=J.q8(z.gwd(a))
+if(J.de(y,0))return
+if(typeof y!=="number")return H.s(y)
+x=0
+for(;x<y;++x)if(J.YV(J.UQ(z.gwd(a),x))===!0)this.PP(J.UQ(z.gwd(a),x))
+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,363,[]]},
+No:{
+"^":["Pi;ec?,i2<-407",null,function(){return[C.mI]}],
+guw:[function(a){return this.ec},null,null,1,0,408,"app",356],
+Sl:[function(a){return this.GS(a).ml(new G.PG()).OA(new G.YW())},"call$1","gdI",2,0,null,265,[]],
+AQ:[function(a){var z,y,x,w,v,u
+z=this.i2
+y=J.U6(z)
+x=y.t(z,a)
+if(x!=null)return x
+w=P.L5(null,null,null,J.O,G.rj)
+w=R.Jk(w)
+v=H.VM([],[G.kx])
+u=P.L5(null,null,null,J.O,J.GW)
+u=R.Jk(u)
+x=new G.bv(this,a,"Isolate",null,w,v,"isolate",null,null,null,u,0,0,null,null,null,null)
+y.u(z,a,x)
+return x},"call$1","grE",2,0,null,110,[]],
+GR:[function(a){var z=[]
+J.kH(this.i2,new G.Yu(a,z))
+H.bQ(z,new G.y2(this))
+J.kH(a,new G.Hq(this))},"call$1","gZM",2,0,null,111,[]],
+r3:[function(){this.Sl("isolates").ml(new G.Pl(this))},"call$0","gNI",0,0,null]},
+PG:{
+"^":"Tp:107;",
+call$1:[function(a){var z,y,x,w,v
+try{z=C.xr.kV(a)
+w=R.Jk(z)
+return w}catch(v){w=H.Ru(v)
+y=w
+x=new H.XO(v,null)
+w=H.B7(["type","Error","errorType","DecodeError","text",H.d(y)+" "+H.d(x)],P.L5(null,null,null,null,null))
+w=R.Jk(w)
+return w}},"call$1",null,2,0,null,379,[],"call"],
+$isEH:true},
+YW:{
+"^":"Tp:107;",
+call$1:[function(a){var z=H.B7(["type","Error","errorType","FetchError","text",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,160,[],"call"],
+$isEH:true},
+BO:{
+"^":"Tp:107;a",
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,409,[],"call"],
+$isEH:true},
+Yu:{
+"^":"Tp:346;a,b",
+call$2:[function(a,b){if(G.js(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,402,[],277,[],"call"],
+$isEH:true},
+y2:{
+"^":"Tp:107;c",
+call$1:[function(a){J.V1(this.c.i2,a)},"call$1",null,2,0,null,110,[],"call"],
+$isEH:true},
+Hq:{
+"^":"Tp:107;d",
+call$1:[function(a){var z,y,x,w,v,u,t,s,r
+z=J.U6(a)
+y=z.t(a,"id")
+x=this.d
+w=x.i2
+v=J.U6(w)
+u=v.t(w,y)
+if(u==null){t=P.L5(null,null,null,J.O,G.rj)
+t=R.Jk(t)
+s=H.VM([],[G.kx])
+r=P.L5(null,null,null,J.O,J.GW)
+r=R.Jk(r)
+u=new G.bv(x,z.t(a,"id"),"Isolate",null,t,s,z.t(a,"name"),null,null,null,r,0,0,null,null,null,null)
+v.u(w,y,u)}J.KM(u)},"call$1",null,2,0,null,149,[],"call"],
+$isEH:true},
+Pl:{
+"^":"Tp:107;a",
+call$1:[function(a){var z,y
+z=this.a
+z.GR(J.UQ(a,"members"))
+z=z.ec
+z.toString
+y=R.Jk(a)
+z.AJ=F.Wi(z,C.mE,z.AJ,y)},"call$1",null,2,0,null,149,[],"call"],
+$isEH:true},
+XK:{
+"^":["No;Yu<,ec,i2-407,AP,fn",null,null,function(){return[C.mI]},null,null],
+GS:[function(a){var z=this.Yu
+N.Jx("").To("Fetching "+H.d(a)+" from "+z)
+return W.It(C.xB.g(z,a),null,null)},"call$1","gFw",2,0,null,265,[]]},
+ho:{
+"^":["No;Ct,pL,ec,i2-407,AP,fn",null,null,null,function(){return[C.mI]},null,null],
+rz:[function(a){var z,y,x,w,v
+z=J.RE(a)
+y=J.UQ(z.gRn(a),"id")
+x=J.UQ(z.gRn(a),"name")
+w=J.UQ(z.gRn(a),"data")
+if(!J.de(x,"observatoryData"))return
+z=this.Ct
+v=z.t(0,y)
+z.Rz(0,y)
+J.Xf(v,w)},"call$1","gcW",2,0,158,19,[]],
+GS:[function(a){var z,y,x
+z=""+this.pL
+y=H.B7([],P.L5(null,null,null,null,null))
+y.u(0,"id",z)
+y.u(0,"method","observatoryQuery")
+y.u(0,"query","/"+H.d(a))
+this.pL=this.pL+1
+x=H.VM(new P.Zf(P.Dt(null)),[null])
+this.Ct.u(0,z,x)
+J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
+return x.MM},"call$1","gFw",2,0,null,265,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+"^":"",
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/isolate_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/disassembly_entry.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.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/vm_element.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/heap_profile.dart","package:observatory/src/elements/isolate_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/message_viewer.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,107]},1],["breakpoint_list_element","package:observatory/src/observatory_elements/breakpoint_list.dart",,B,{
+F.E2()},"call$0","nE",0,0,112]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Vf;BW%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grs:[function(a){return a.BW},null,null,1,0,352,"msg",353,354],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,355,23,[],"msg",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP("breakpoints")
-a.hm.gDF().fB(z).ml(new B.j3(a)).OA(new B.i0()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["Ur;BW%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+grs:[function(a){return a.BW},null,null,1,0,354,"msg",355,397],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,357,23,[],"msg",355],
+RF:[function(a,b){a.pC.oX("breakpoints").ml(new B.j3(a)).OA(new B.i0()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{Dw:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
@@ -10765,27 +11501,27 @@
 a.X0=v
 C.J0.ZL(a)
 C.J0.G6(a)
-return a},null,null,0,0,108,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[357],
-Vf:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[414],
+Ur:{
+"^":"PO+Pi;",
 $isd3:true},
 j3:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sBW(z,y.ct(z,C.UX,y.gBW(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sBW(z,y.ct(z,C.UX,y.gBW(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+BreakpointListElement_refresh_closure":[358],
+"+BreakpointListElement_refresh_closure":[415],
 i0:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing breakpoint-list: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing breakpoint-list: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+BreakpointListElement_refresh_closure":[358]}],["class_ref_element","package:observatory/src/observatory_elements/class_ref.dart",,Q,{
+"+BreakpointListElement_refresh_closure":[415]}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10794,21 +11530,19 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.YZ.ZL(a)
 C.YZ.G6(a)
-return a},null,null,0,0,108,"new ClassRefElement$created"]}},
-"+ClassRefElement":[362]}],["class_view_element","package:observatory/src/observatory_elements/class_view.dart",,Z,{
+return a},null,null,0,0,113,"new ClassRefElement$created"]}},
+"+ClassRefElement":[418]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Ps:{
-"^":["pv;F0%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.F0},null,null,1,0,352,"cls",353,354],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,355,23,[],"cls",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.F0,"id"))
-a.hm.gDF().fB(z).ml(new Z.RI(a)).OA(new Z.Ye()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["KU;F0%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRu:[function(a){return a.F0},null,null,1,0,354,"cls",355,397],
+sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,357,23,[],"cls",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.F0,"id")).ml(new Z.RI(a)).OA(new Z.Ye()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10821,27 +11555,27 @@
 a.X0=w
 C.kk.ZL(a)
 C.kk.G6(a)
-return a},null,null,0,0,108,"new ClassViewElement$created"]}},
-"+ClassViewElement":[363],
-pv:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new ClassViewElement$created"]}},
+"+ClassViewElement":[419],
+KU:{
+"^":"PO+Pi;",
 $isd3:true},
 RI:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sF0(z,y.ct(z,C.XA,y.gF0(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sF0(z,y.ct(z,C.XA,y.gF0(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+ClassViewElement_refresh_closure":[358],
+"+ClassViewElement_refresh_closure":[415],
 Ye:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing class-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing class-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+ClassViewElement_refresh_closure":[358]}],["code_ref_element","package:observatory/src/observatory_elements/code_ref.dart",,O,{
+"+ClassViewElement_refresh_closure":[415]}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10850,20 +11584,19 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.IK.ZL(a)
 C.IK.G6(a)
-return a},null,null,0,0,108,"new CodeRefElement$created"]}},
-"+CodeRefElement":[362]}],["code_view_element","package:observatory/src/observatory_elements/code_view.dart",,F,{
+return a},null,null,0,0,113,"new CodeRefElement$created"]}},
+"+CodeRefElement":[418]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
-vc:{
-"^":["Vfx;eJ%-364,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtT:[function(a){return a.eJ},null,null,1,0,365,"code",353,354],
-stT:[function(a,b){a.eJ=this.ct(a,C.b1,a.eJ,b)},null,null,3,0,366,23,[],"code",353],
-grK:[function(a){return"panel panel-success"},null,null,1,0,367,"cssPanelClass"],
+HT:{
+"^":["qbd;eJ%-420,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtT:[function(a){return a.eJ},null,null,1,0,421,"code",355,397],
+stT:[function(a,b){a.eJ=this.ct(a,C.b1,a.eJ,b)},null,null,3,0,422,23,[],"code",355],
+grK:[function(a){return"panel panel-success"},null,null,1,0,370,"cssPanelClass"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10876,34 +11609,34 @@
 a.X0=w
 C.YD.ZL(a)
 C.YD.G6(a)
-return a},null,null,0,0,108,"new CodeViewElement$created"]}},
-"+CodeViewElement":[368],
-Vfx:{
-"^":"uL+Pi;",
-$isd3:true}}],["collapsible_content_element","package:observatory/src/observatory_elements/collapsible_content.dart",,R,{
+return a},null,null,0,0,113,"new CodeViewElement$created"]}},
+"+CodeViewElement":[423],
+qbd:{
+"^":"PO+Pi;",
+$isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Dsd;zh%-369,HX%-369,Uy%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gl7:[function(a){return a.zh},null,null,1,0,367,"iconClass",353,370],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,25,23,[],"iconClass",353],
-gai:[function(a){return a.HX},null,null,1,0,367,"displayValue",353,370],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,25,23,[],"displayValue",353],
-gxj:[function(a){return a.Uy},null,null,1,0,371,"collapsed"],
+"^":["Ds;zh%-387,HX%-387,Uy%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gl7:[function(a){return a.zh},null,null,1,0,370,"iconClass",355,356],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,25,23,[],"iconClass",355],
+gai:[function(a){return a.HX},null,null,1,0,370,"displayValue",355,356],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,25,23,[],"displayValue",355],
+gxj:[function(a){return a.Uy},null,null,1,0,380,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,372,373,[],"collapsed"],
+this.np(a)},null,null,3,0,381,424,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"call$0","gQd",0,0,107,"enteredView"],
+this.np(a)},"call$0","gQd",0,0,112,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
-this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,374,18,[],303,[],74,[],"toggleDisplay"],
-SS:[function(a){var z,y
+this.np(a)
+this.np(a)},"call$3","gl8",6,0,425,18,[],306,[],74,[],"toggleDisplay"],
+np:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 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,107,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,112,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-369,DI<-369",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-387,DI<-387",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10917,32 +11650,32 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.G6(a)
-return a},null,null,0,0,108,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[375],
-Dsd:{
+return a},null,null,0,0,113,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[426],
+Ds:{
 "^":"uL+Pi;",
-$isd3:true}}],["curly_block_element","package:observatory/src/observatory_elements/curly_block.dart",,R,{
+$isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["Nr;GV%-360,Hu%-360,nx%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-goE:[function(a){return a.GV},null,null,1,0,371,"expanded",353,370],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,372,23,[],"expanded",353],
-gO9:[function(a){return a.Hu},null,null,1,0,371,"busy",353,370],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,372,23,[],"busy",353],
-gFR:[function(a){return a.nx},null,null,1,0,108,"callback",353,354],
+"^":["LP;GV%-417,Hu%-417,nx%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+goE:[function(a){return a.GV},null,null,1,0,380,"expanded",355,356],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,381,23,[],"expanded",355],
+gO9:[function(a){return a.Hu},null,null,1,0,380,"busy",355,356],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,381,23,[],"busy",355],
+gFR:[function(a){return a.nx},null,null,1,0,113,"callback",355,397],
 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,225,23,[],"callback",353],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,107,23,[],"callback",355],
 PA:[function(a){var z
 P.JS("done callback")
 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,107,"doneCallback"],
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,112,"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","ghM",6,0,376,123,[],183,[],280,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,427,128,[],188,[],283,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10958,9 +11691,9 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.G6(a)
-return a},null,null,0,0,108,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[377],
-Nr:{
+return a},null,null,0,0,113,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[428],
+LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
 "^":"",
@@ -10971,20 +11704,20 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
 return z.gtH(z)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,109,[],110,[]],
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,114,[],115,[]],
 Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.call$1(z.lo)===!0)return!0
-return!1},"call$2","cs",4,0,null,109,[],110,[]],
+return!1},"call$2","cs",4,0,null,114,[],115,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.call$2(b,z.lo)
-return b},"call$3","hp",6,0,null,109,[],111,[],112,[]],
+return b},"call$3","hp",6,0,null,114,[],116,[],117,[]],
 mx:[function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
@@ -10993,11 +11726,11 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"call$3","FQ",6,0,null,109,[],113,[],114,[]],
+x.pop()}return z.gvM()},"call$3","FQ",6,0,null,114,[],118,[],119,[]],
 K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-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,68,[],115,[],116,[]],
+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,68,[],120,[],121,[]],
 Og:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
 z=J.xH(c,b)
@@ -11005,7 +11738,7 @@
 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"))
-H.tb(d,e,a,b,z)},"call$5","rK",10,0,null,68,[],115,[],116,[],105,[],117,[]],
+H.tb(d,e,a,b,z)},"call$5","rK",10,0,null,68,[],120,[],121,[],105,[],122,[]],
 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))
@@ -11020,31 +11753,31 @@
 H.Og(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.lo
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","f3",6,0,null,68,[],47,[],109,[]],
+C.Nm.u(a,b,v)}},"call$3","f3",6,0,null,68,[],47,[],114,[]],
 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))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,118,[],119,[],120,[],121,[],122,[]],
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,123,[],124,[],125,[],126,[],127,[]],
 TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"call$4","Yh",8,0,null,123,[],124,[],80,[],125,[]],
+if(J.de(a[z],b))return z}return-1},"call$4","Yh",8,0,null,128,[],129,[],80,[],130,[]],
 eX:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"call$3","Gf",6,0,null,123,[],124,[],80,[]],
+if(J.de(a[y],b))return y}return-1},"call$3","Gf",6,0,null,128,[],129,[],80,[]],
 ZE:[function(a,b,c,d){if(J.Hb(J.xH(c,b),32))H.d1(a,b,c,d)
-else H.d4(a,b,c,d)},"call$4","UR",8,0,null,123,[],126,[],127,[],128,[]],
+else H.d4(a,b,c,d)},"call$4","UR",8,0,null,128,[],131,[],132,[],133,[]],
 d1:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 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","aH",8,0,null,123,[],126,[],127,[],128,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","aH",8,0,null,128,[],131,[],132,[],133,[]],
 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.IJ(J.WB(z.W(a0,b),1),6)
@@ -11145,7 +11878,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,123,[],126,[],127,[],128,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,128,[],131,[],132,[],133,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -11154,7 +11887,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,378,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
 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))},
@@ -11163,13 +11896,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,124,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,129,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(this)
 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,379,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,430,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11189,17 +11922,17 @@
 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","gnr",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,379,[]],
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,110,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gnr",0,2,null,333,334,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,430,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=b
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,111,[],112,[]],
-eR:[function(a,b){return H.j5(this,b,null,null)},"call$1","gZo",2,0,null,122,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,116,[],117,[]],
+eR:[function(a,b){return H.j5(this,b,null,null)},"call$1","gZo",2,0,null,127,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -11212,7 +11945,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,"gRV",0,3,null,336,337,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11236,7 +11969,7 @@
 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,47,[]],
-eR:[function(a,b){return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,122,[]],
+eR:[function(a,b){return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,127,[]],
 qZ:[function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(P.N(b))
 z=this.AN
@@ -11244,7 +11977,7 @@
 if(z==null)return H.j5(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.j5(this.l6,y,x,null)}},"call$1","gVw",2,0,null,122,[]],
+return H.j5(this.l6,y,x,null)}},"call$1","grK4",2,0,null,127,[]],
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
@@ -11288,14 +12021,14 @@
 "^":"i1;l6,T6",
 $isyN:true},
 MH:{
-"^":"Yl;lo,OI,T6",
+"^":"AC;lo,OI,T6",
 mb:function(a){return this.T6.call$1(a)},
 G:[function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
 return!1},"call$0","gqy",0,0,null],
 gl:function(){return this.lo},
-$asYl:function(a,b){return[b]}},
+$asAC:function(a,b){return[b]}},
 A8:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
@@ -11311,7 +12044,7 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 SO:{
-"^":"Yl;OI,T6",
+"^":"AC;OI,T6",
 mb:function(a){return this.T6.call$1(a)},
 G:[function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},"call$0","gqy",0,0,null],
@@ -11337,7 +12070,7 @@
 return!0},"call$0","gqy",0,0,null]},
 H6:{
 "^":"mW;l6,FT",
-eR:[function(a,b){return H.ke(this.l6,this.FT+b,H.Kp(this,0))},"call$1","gZo",2,0,null,289,[]],
+eR:[function(a,b){return H.ke(this.l6,this.FT+b,H.Kp(this,0))},"call$1","gZo",2,0,null,292,[]],
 gA:function(a){var z=this.l6
 z=new H.U1(z.gA(z),this.FT)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -11358,7 +12091,7 @@
 return 0},
 $isyN:true},
 U1:{
-"^":"Yl;OI,FT",
+"^":"AC;OI,FT",
 G:[function(){var z,y
 for(z=this.OI,y=0;y<this.FT;++y)z.G()
 this.FT=0
@@ -11373,8 +12106,8 @@
 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,23,[]],
 xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gRI",2,0,null,124,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,114,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gRI",2,0,null,129,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gyP",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,47,[]]},
 Qr:{
@@ -11383,12 +12116,12 @@
 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,23,[]],
 xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gRI",2,0,null,124,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,77,128,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,114,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gRI",2,0,null,129,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,77,133,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gyP",0,0,null],
 KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isList:true,
 $asWO:null,
 $isyN:true,
@@ -11430,16 +12163,16 @@
 "^":"",
 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,129,[]],
+X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,134,[]],
 vn:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"call$1","Yf",2,0,130,131,[]],
+else return new H.iu(a,4)},"call$1","Yf",2,0,135,136,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,132,[]],
+return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,137,[]],
 tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.U6(b)
 y=z.u8(b,"/")
@@ -11475,15 +12208,15 @@
 if(m==null||m.length===0)x=n
 else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
 x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"call$2","ER",4,0,null,129,[],132,[]],
+return x},"call$2","ER",4,0,null,134,[],137,[]],
 Vv:[function(a){var z,y,x
 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()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,133,[]],
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,138,[]],
 Fk:[function(a){var z,y,x
 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,133,[]],
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,138,[]],
 vE:[function(a,b){var z,y,x,w,v,u
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
@@ -11493,7 +12226,7 @@
 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
-z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,133,[],134,[]],
+z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,138,[],139,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
@@ -11501,14 +12234,14 @@
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"call$2","V8",4,0,null,135,[],132,[]],
+return w},"call$2","V8",4,0,null,140,[],137,[]],
 w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","QB",4,0,null,137,[],12,[]],
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","QB",4,0,null,142,[],12,[]],
 Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -11525,9 +12258,9 @@
 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)
-return P.re(C.yQ)},"call$2","xN",4,0,null,138,[],11,[]],
+return P.re(C.yQ)},"call$2","xN",4,0,null,143,[],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,138,[],139,[]],
+return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,143,[],144,[]],
 pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
@@ -11537,7 +12270,7 @@
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
 w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 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,140,[]],
+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,145,[]],
 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),",")
@@ -11548,7 +12281,7 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,138,[],141,[],61,[],51,[]],
+if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,143,[],146,[],61,[],51,[]],
 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,26,[],98,[]],
@@ -11588,14 +12321,14 @@
 l=p==null?C.xD:p()
 J.bi(z.to(u,new H.nI()),new H.Uz(s,r,q,l,o,n,m,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){return H.VM([],[P.D4])},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TY:{
 "^":"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,41,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,41,[],168,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gfH",4,0,null,41,[],173,[]],
 $isej:true},
 Lj:{
 "^":"TY;MA",
@@ -11604,15 +12337,15 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:381;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,380,[],"call"],
+"^":"Tp:432;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,431,[],"call"],
 $isEH:true},
 am:{
 "^":"TY;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","gqi",4,0,null,43,[],44,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,43,[],44,[]],
 $isNL:true,
 $isej:true},
 cw:{
@@ -11670,7 +12403,7 @@
 if(w==null)w=this.gcc().nb.t(0,a)
 if(w==null)throw H.b(P.lr(this,H.X7(a),[b],null,null))
 w.Hy(this,b)
-return H.vn(b)},"call$2","gtd",4,0,null,65,[],168,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
 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,65,[]],
@@ -11770,19 +12503,19 @@
 "^":"am+M2;",
 $isej:true},
 IB:{
-"^":"Tp:382;a",
+"^":"Tp:433;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:382;a",
+"^":"Tp:433;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return this.a},"call$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
-"^":"Un;AY<,XW,BB,eL,If",
+"^":"Un;AY<,XW,BB,Ra,If",
 gOO:function(){return"ClassMirror"},
 gIf:function(){var z,y
 z=this.BB
@@ -11796,7 +12529,7 @@
 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,77,24,[],43,[],44,[]],
 rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,65,[]],
-PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],168,[]],
+PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
 gkZ:function(){return[this.XW]},
 gHA:function(){return!0},
 gJi:function(){return this},
@@ -11834,10 +12567,10 @@
 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","gqi",8,0,null,12,[],11,[],383,[],82,[]],
+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,[],434,[],82,[]],
 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,65,[],168,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
 rN:[function(a){var z,y,x,w
 $loop$0:{z=this.xq
 if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
@@ -11867,12 +12600,12 @@
 t.v=t.m=w
 return y},"call$1","gFf",2,0,null,65,[]],
 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,238,[],384,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,110,[],435,[]],
 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","gER",4,0,null,12,[],384,[]],
+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,[],435,[]],
 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","gpa",4,0,null,12,[],384,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gpa",4,0,null,12,[],435,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -11888,15 +12621,15 @@
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:385;a",
+"^":"Tp:436;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,129,[],23,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,134,[],23,[],"call"],
 $isEH:true},
 bl:{
-"^":"am;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,eL,RH,If",
+"^":"am;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If",
 gOO:function(){return"ClassMirror"},
 gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
 return this.NK.gCr()},
@@ -11948,7 +12681,7 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,65,[],168,[]],
+PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,65,[],173,[]],
 rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,65,[]],
 gXP:function(){return this.NK.gXP()},
 gc9:function(){return this.NK.gc9()},
@@ -11982,23 +12715,23 @@
 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,386,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:225;",
-call$1:[function(a){return-1},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return-1},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,87,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,387,[],"call"],
+return a},"call$1",null,2,0,null,438,[],"call"],
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,eL,RH,nz,If",
+"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If",
 gOO:function(){return"ClassMirror"},
 gaB:function(){var z,y
 z=this.Tx
@@ -12033,7 +12766,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.nz=a}return x},"call$1","gN4",2,0,null,388,[]],
+s.nz=a}return x},"call$1","gN4",2,0,null,439,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12049,7 +12782,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","gkW",2,0,null,389,[]],
+return z},"call$1","gMp",2,0,null,440,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12089,7 +12822,7 @@
 if(z!=null&&z.gFo()&&!z.gV5()){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
-return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],168,[]],
+return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
 rN:[function(a){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gao()
@@ -12138,7 +12871,7 @@
 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
-return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,138,[]],
+return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,143,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
 z=this.MR(this)
@@ -12168,17 +12901,17 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:382;a",
+"^":"Tp:433;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,387,[],"call"],
+return a},"call$1",null,2,0,null,438,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:391;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:442;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 Ld:{
 "^":"am;ao<,V5<,Fo<,n6,nz,Ay>,le,If",
@@ -12191,7 +12924,7 @@
 this.le=z}return J.C0(z,H.Yf()).br(0)},
 IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,41,[]],
 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,41,[],168,[]],
+$[this.ao]=b},"call$2","gfH",4,0,null,41,[],173,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12222,7 +12955,7 @@
 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
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"call$1","fS",2,0,null,136,[]]}},
+return 0},"call$1","fS",2,0,null,141,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -12292,11 +13025,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","gqi",4,0,null,43,[],44,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,43,[],44,[]],
 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,41,[]],
 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,41,[],168,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gfH",4,0,null,41,[],173,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -12329,8 +13062,8 @@
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:392;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:372;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 ng:{
 "^":"am;Cr<,CM,If",
@@ -12402,15 +13135,15 @@
 z=x+"'"
 this.o3=z
 return z},"call$0","gXo",0,0,null],
-gah:function(){return H.vh(P.SY(null))},
-V7:function(a,b){return this.gah().call$2(a,b)},
-nQ:function(a){return this.gah().call$1(a)},
+gwK:function(){return H.vh(P.SY(null))},
+V7:function(a,b){return this.gwK().call$2(a,b)},
+nQ:function(a){return this.gwK().call$1(a)},
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:393;a",
+"^":"Tp:443;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
@@ -12418,7 +13151,7 @@
 return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:394;b",
+"^":"Tp:444;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
@@ -12429,12 +13162,12 @@
 return z.gCr()},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:392;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:372;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:392;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:372;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
@@ -12444,7 +13177,7 @@
 t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,42,[]],
 x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,42,[]],
 di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
 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
@@ -12464,10 +13197,10 @@
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,142,[],143,[]],
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,147,[],148,[]],
 YK:[function(a){var z=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.O])
 a.aN(0,new H.Xh(z))
-return z},"call$1","OX",2,0,null,144,[]],
+return z},"call$1","OX",2,0,null,149,[]],
 kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -12476,16 +13209,16 @@
   return result;
 })(a, Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"call$1","wp",2,0,null,140,[]],
+return z},"call$1","wp",2,0,null,145,[]],
 Xh:{
-"^":"Tp:395;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,132,[],383,[],"call"],
+"^":"Tp:445;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,137,[],434,[],"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,145,[],146,[]],
+else return b.cR(a)},"call$2","p3",4,0,null,150,[],151,[]],
 pH:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -12505,7 +13238,7 @@
 y=J.Q
 t=H.VM(new P.Zf(P.Dt(y)),[y])
 z.a=t
-return t.MM},"call$2$eagerError","pk",2,3,null,147,148,[],149,[]],
+return t.MM},"call$2$eagerError","pk",2,3,null,152,153,[],154,[]],
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
@@ -12514,7 +13247,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"call$0","qZ",0,0,107],
+throw z}},"call$0","qZ",0,0,112],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -12522,11 +13255,11 @@
 $.S6=z
 P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"call$1","xc",2,0,null,151,[]],
+$.k8=y}},"call$1","xc",2,0,null,156,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,151,[]],
+z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,156,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -12542,70 +13275,70 @@
 return}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-$.X3.hk(y,x)}},"call$1","DC",2,0,null,152,[]],
-YE:[function(a){},"call$1","bZ",2,0,153,23,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,154,77,155,[],156,[]],
-dL:[function(){return},"call$0","v3",0,0,107],
+$.X3.hk(y,x)}},"call$1","DC",2,0,null,157,[]],
+YE:[function(a){},"call$1","bZ",2,0,158,23,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,159,77,160,[],161,[]],
+dL:[function(){return},"call$0","v3",0,0,112],
 FE:[function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(z,y)}},"call$3","CV",6,0,null,157,[],158,[],159,[]],
+c.call$2(z,y)}},"call$3","CV",6,0,null,162,[],163,[],164,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"call$4","QD",8,0,null,160,[],161,[],155,[],156,[]],
-TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,160,[],161,[]],
+b.K5(c,d)},"call$4","QD",8,0,null,165,[],166,[],160,[],161,[]],
+TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,165,[],166,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,160,[],161,[],23,[]],
+b.rX(c)},"call$3","iB",6,0,null,165,[],166,[],23,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=C.jn.cU(a.Fq,1000)
-return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,162,[],151,[]],
+return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,167,[],156,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"call$1","kb",2,0,null,146,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,163,164,[],165,[],146,[],155,[],156,[]],
+return z},"call$1","kb",2,0,null,151,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,168,169,[],170,[],151,[],160,[],161,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.call$0()
 z=P.PJ(c)
 try{y=d.call$0()
-return y}finally{$.X3=z}},"call$4","AI",8,0,166,164,[],165,[],146,[],110,[]],
+return y}finally{$.X3=z}},"call$4","AI",8,0,171,169,[],170,[],151,[],115,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.call$1(e)
 z=P.PJ(c)
 try{y=d.call$1(e)
-return y}finally{$.X3=z}},"call$5","MM",10,0,167,164,[],165,[],146,[],110,[],168,[]],
+return y}finally{$.X3=z}},"call$5","MM",10,0,172,169,[],170,[],151,[],115,[],173,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.call$2(e,f)
 z=P.PJ(c)
 try{y=d.call$2(e,f)
-return y}finally{$.X3=z}},"call$6","l4",12,0,169,164,[],165,[],146,[],110,[],54,[],55,[]],
-Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,170,164,[],165,[],146,[],110,[]],
-cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,171,164,[],165,[],146,[],110,[]],
-VI:[function(a,b,c,d){return d},"call$4","uu",8,0,172,164,[],165,[],146,[],110,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,173,164,[],165,[],146,[],110,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,174,164,[],165,[],146,[],162,[],151,[]],
-XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,175,164,[],165,[],146,[],176,[]],
-CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,177,176,[]],
+return y}finally{$.X3=z}},"call$6","l4",12,0,174,169,[],170,[],151,[],115,[],54,[],55,[]],
+Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,175,169,[],170,[],151,[],115,[]],
+cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,176,169,[],170,[],151,[],115,[]],
+VI:[function(a,b,c,d){return d},"call$4","uu",8,0,177,169,[],170,[],151,[],115,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,178,169,[],170,[],151,[],115,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,179,169,[],170,[],151,[],167,[],156,[]],
+XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,180,169,[],170,[],151,[],181,[]],
+CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,182,181,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Fl()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"call$5","hn",10,0,178,164,[],165,[],146,[],179,[],180,[]],
+return new P.uo(c,d,z)},"call$5","hn",10,0,183,169,[],170,[],151,[],184,[],185,[]],
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
 Ik:{
 "^":"O9;Y8"},
 JI:{
-"^":"oh;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
+"^":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
 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,396,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,446,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},"call$0","gUe",0,0,null],
+this.Ae=z^1},"call$0","gXI1",0,0,null],
 gP4:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
@@ -12615,10 +13348,10 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){return},"call$0","gp4",0,0,107],
-LP:[function(){return},"call$0","gZ9",0,0,107],
+uO:[function(){return},"call$0","gp4",0,0,112],
+LP:[function(){return},"call$0","gZ9",0,0,112],
 static:{"^":"FJ,RG,cP"}},
-Ks:{
+LO:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
 gP4:function(){return(this.Gv&2)!==0},
@@ -12633,17 +13366,17 @@
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
-a.siE(a)},"call$1","gOo",2,0,null,160,[]],
+a.siE(a)},"call$1","gOo",2,0,null,165,[]],
 j0:[function(a){if(a.giE()===a)return
 if(a.gP4())a.dK()
 else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,160,[]],
+if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,165,[]],
 q7:[function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},"call$0","gVo",0,0,null],
 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,"Ks")},233,[]],
+this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"LO")},239,[]],
 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","gXB",2,2,397,77,155,[],156,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gXB",2,2,447,77,160,[],161,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -12652,8 +13385,8 @@
 y=this.SL()
 this.SY()
 return y},"call$0","gJK",0,0,null],
-Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,233,[]],
-V8:[function(a,b){this.pb(a,b)},"call$2","grd",4,0,null,155,[],156,[]],
+Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,239,[]],
+V8:[function(a,b){this.pb(a,b)},"call$2","grd",4,0,null,160,[],161,[]],
 Qj:[function(){var z=this.WX
 this.WX=null
 this.Gv=this.Gv&4294967287
@@ -12677,45 +13410,45 @@
 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,378,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,429,[]],
 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:{
-"^":"Ks;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv=this.Gv|2
 this.iE.Rg(0,a)
 this.Gv=this.Gv&4294967293
 if(this.iE===this)this.Of()
-return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,233,[]],
+return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,239,[]],
 pb:[function(a,b){if(this.iE===this)return
-this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,155,[],156,[]],
+this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,160,[],161,[]],
 SY:[function(){if(this.iE!==this)this.nE(new P.Bg(this))
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
 tK:{
 "^":"Tp;a,b",
-call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,160,[],"call"],
+call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,165,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,160,[],"call"],
+call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,165,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-call$1:[function(a){a.Qj()},"call$1",null,2,0,null,160,[],"call"],
+call$1:[function(a){a.Qj()},"call$1",null,2,0,null,165,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Zj",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
-"^":"Ks;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},"call$1","gm9",2,0,null,233,[]],
+z.w6(y)}},"call$1","gm9",2,0,null,239,[]],
 pb:[function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,155,[],156,[]],
+for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,160,[],161,[]],
 SY:[function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
@@ -12723,7 +13456,7 @@
 "^":"a;",
 $isb8:true},
 j7:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -12732,10 +13465,10 @@
 z.c=x
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"call$2",null,4,0,null,398,[],399,[],"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"call$2",null,4,0,null,448,[],449,[],"call"],
 $isEH:true},
 ff:{
-"^":"Tp:400;a,c,d",
+"^":"Tp:450;a,c,d",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.c-1
@@ -12754,12 +13487,12 @@
 "^":"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,401,77,23,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,451,77,23,[]],
 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,397,77,155,[],156,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,447,77,160,[],161,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -12774,28 +13507,28 @@
 z=$.X3
 y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
-return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"gxY",2,3,null,77,110,[],159,[]],
+return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"gVy",2,3,null,77,115,[],164,[]],
 yd:[function(a,b){var z,y,x
 z=$.X3
 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,77,159,[],379,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,77,164,[],430,[]],
 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","gE1",2,0,null,378,[]],
+return y},"call$1","gE1",2,0,null,429,[]],
 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,23,[]],
+this.jk=a},"call$1","gHa",2,0,null,23,[]],
 E6:[function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,155,[],156,[]],
+this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,160,[],161,[]],
 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,294,[]],
+this.jk=a}},"call$1","gXA",2,0,null,297,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
@@ -12809,7 +13542,7 @@
 P.HZ(this,y)},"call$1","gJJ",2,0,null,23,[]],
 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,154,77,155,[],156,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,159,77,160,[],161,[]],
 OH:[function(a){var z,y
 z=J.x(a)
 y=typeof a==="object"&&a!==null&&!!z.$isb8
@@ -12821,7 +13554,7 @@
 this.Lj.wr(new P.rH(this,a))},"call$1","gZV",2,0,null,23,[]],
 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,155,[],156,[]],
+this.Lj.wr(new P.ZL(this,a,b))},"call$2","gFE",4,0,null,160,[],161,[]],
 L7:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
@@ -12837,7 +13570,7 @@
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,27,[],150,[]],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,27,[],155,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -12878,29 +13611,29 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","WY",4,0,null,27,[],150,[]]}},
+b=p}},"call$2","DU",4,0,null,27,[],155,[]]}},
 da:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 xw:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){this.a.rX(a)},"call$1",null,2,0,null,23,[],"call"],
 $isEH:true},
 dm:{
-"^":"Tp:402;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,77,155,[],156,[],"call"],
+"^":"Tp:452;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,77,160,[],161,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:108;a,b,c",
+"^":"Tp:113;a,b,c",
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:371;b,c,d,e",
+"^":"Tp:380;b,c,d,e",
 call$0:[function(){var z,y,x,w
 try{this.b.c=this.e.FI(this.d.gO1(),this.c.e.gDL())
 return!0}catch(x){w=H.Ru(x)
@@ -12910,7 +13643,7 @@
 return!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:107;c,b,f,UI",
+"^":"Tp:112;c,b,f,UI",
 call$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.f
@@ -12946,7 +13679,7 @@
 r.b=!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:107;c,b,bK,Gq,Rm",
+"^":"Tp:112;c,b,bK,Gq,Rm",
 call$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -12968,25 +13701,25 @@
 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:225;c,w3",
-call$1:[function(a){P.HZ(this.c.e,this.w3)},"call$1",null,2,0,null,403,[],"call"],
+"^":"Tp:107;c,w3",
+call$1:[function(a){P.HZ(this.c.e,this.w3)},"call$1",null,2,0,null,453,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:402;a,HZ",
+"^":"Tp:452;a,HZ",
 call$2:[function(a,b){var z,y,x,w
 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.HZ)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,155,[],156,[],"call"],
+w.E6(a,b)}P.HZ(z.a,this.HZ)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,160,[],161,[],"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,404,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,454,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -12998,13 +13731,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,378,[]],
+return y},"call$1","gjw",2,0,null,429,[]],
 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,379,[]],
+return y},"call$1","gG2",2,0,null,430,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
@@ -13024,7 +13757,7 @@
 return y},"call$0","gRV",0,0,null],
 eR:[function(a,b){var z=H.VM(new P.dq(b,this),[null])
 z.U6(this,b,null)
-return z},"call$1","gZo",2,0,null,122,[]],
+return z},"call$1","gZo",2,0,null,127,[]],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13052,36 +13785,36 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,124,[],"call"],
+P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:108;e,f",
+"^":"Tp:113;e,f",
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:372;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,405,[],"call"],
+"^":"Tp:381;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
 $isEH:true},
 zn:{
-"^":"Tp:108;bK",
+"^":"Tp:113;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,124,[],"call"],
+call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,129,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:108;e,f",
+"^":"Tp:113;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:225;",
-call$1:[function(a){},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:108;UI",
+"^":"Tp:113;UI",
 call$0:[function(){this.UI.rX(null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -13089,45 +13822,45 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,124,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:108;e,f",
+"^":"Tp:113;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:372;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,405,[],"call"],
+"^":"Tp:381;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:108;bK",
+"^":"Tp:113;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
-z.a=z.a+1},"call$1",null,2,0,null,237,[],"call"],
+z.a=z.a+1},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 uO:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){this.b.rX(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:225;a,b",
-call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:108;c",
+"^":"Tp:113;c",
 call$0:[function(){this.c.rX(!0)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,233,[],"call"],
+call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,239,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:108;c,d",
+"^":"Tp:113;c,d",
 call$0:[function(){this.d.rX(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
@@ -13136,7 +13869,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:108;d",
+"^":"Tp:113;d",
 call$0:[function(){this.d.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
@@ -13147,7 +13880,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:108;a,c",
+"^":"Tp:113;a,c",
 call$0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
@@ -13160,7 +13893,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ib:{
-"^":"Tp:108;a,d",
+"^":"Tp:113;a,d",
 call$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -13183,7 +13916,7 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gGE",2,0,null,406,[]],
+return w},"call$1","gGE",2,0,null,456,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
 n:[function(a,b){var z
 if(b==null)return!1
@@ -13192,27 +13925,27 @@
 if(typeof b!=="object"||b===null||!z.$isO9)return!1
 return b.Y8===this.Y8},"call$1","gUJ",2,0,null,104,[]],
 $isO9:true},
-oh:{
+yU:{
 "^":"KA;Y8<",
 tA:[function(){return this.gY8().j0(this)},"call$0","gQC",0,0,null],
-uO:[function(){this.gY8()},"call$0","gp4",0,0,107],
-LP:[function(){this.gY8()},"call$0","gZ9",0,0,107]},
+uO:[function(){this.gY8()},"call$0","gp4",0,0,112],
+LP:[function(){this.gY8()},"call$0","gZ9",0,0,112]},
 nP:{
 "^":"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,407,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,457,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
 this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,29,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,408,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,458,[]],
 nB:[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.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,409,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13236,19 +13969,19 @@
 Rg:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,233,[]],
+else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,239,[]],
 V8:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},"call$2","grd",4,0,null,155,[],156,[]],
+else this.w6(new P.DS(a,b,null))},"call$2","grd",4,0,null,160,[],161,[]],
 Qj:[function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},"call$0","gS2",0,0,null],
-uO:[function(){},"call$0","gp4",0,0,107],
-LP:[function(){},"call$0","gZ9",0,0,107],
+uO:[function(){},"call$0","gp4",0,0,112],
+LP:[function(){},"call$0","gZ9",0,0,112],
 tA:[function(){},"call$0","gQC",0,0,null],
 w6:[function(a){var z,y
 z=this.Ri
@@ -13257,19 +13990,19 @@
 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,410,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,384,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,233,[]],
+this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,239,[]],
 pb:[function(a,b){var z,y
 z=this.Gv
 y=new P.Vo(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
 this.Ek()
 y.call$0()}else{y.call$0()
-this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,155,[],156,[]],
+this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,160,[],161,[]],
 SY:[function(){this.Ek()
 this.Gv=(this.Gv|16)>>>0
 new P.qB(this).call$0()},"call$0","gXm",0,0,null],
@@ -13277,7 +14010,7 @@
 this.Gv=(z|32)>>>0
 a.call$0()
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gc2",2,0,null,151,[]],
+this.Kl((z&4)!==0)},"call$1","gc2",2,0,null,156,[]],
 Kl:[function(a){var z,y,x
 z=this.Gv
 if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
@@ -13293,11 +14026,11 @@
 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,411,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,460,[]],
 $isMO:true,
 static:{"^":"ry,bG,Q9,Ir,Il,X8,HX,GC,f9"}},
 Vo:{
-"^":"Tp:107;a,b,c",
+"^":"Tp:112;a,b,c",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -13313,7 +14046,7 @@
 else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"call$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -13328,25 +14061,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,77,77,77,412,[],406,[],413,[],159,[]],
+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,77,77,77,461,[],456,[],462,[],164,[]],
 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","gGE",2,0,null,406,[]]},
+return y},"call$1","gGE",2,0,null,456,[]]},
 ti:{
 "^":"a;aw@"},
 LV:{
 "^":"ti;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,414,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,463,[]]},
 DS:{
 "^":"ti;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,414,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,463,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,414,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,463,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -13355,9 +14088,9 @@
 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,414,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,463,[]]},
 CR:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -13371,26 +14104,26 @@
 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,410,[]],
+this.N6=b}},"call$1","ght",2,0,null,384,[]],
 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,414,[]],
+z.dP(a)},"call$1","gKt",2,0,null,463,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null},"call$0","gyP",0,0,null]},
 v1y:{
-"^":"Tp:108;a,b,c",
+"^":"Tp:113;a,b,c",
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:415;a,b",
-call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,155,[],156,[],"call"],
+"^":"Tp:464;a,b",
+call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,160,[],161,[],"call"],
 $isEH:true},
 Q0:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){return this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
@@ -13406,27 +14139,27 @@
 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,77,77,77,412,[],406,[],413,[],159,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,233,[],416,[]],
+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,77,77,77,461,[],456,[],462,[],164,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,239,[],465,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,233,[]],
+P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,239,[]],
 V8:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},"call$2","grd",4,0,null,155,[],156,[]],
+P.KA.prototype.V8.call(this,a,b)},"call$2","grd",4,0,null,160,[],161,[]],
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"call$0","gp4",0,0,107],
+z.yy(0)},"call$0","gp4",0,0,112],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE()},"call$0","gZ9",0,0,107],
+z.QE()},"call$0","gZ9",0,0,112],
 tA:[function(){var z=this.Ee
 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")},233,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,417,155,[],156,[]],
-nn:[function(){this.Qj()},"call$0","gH1",0,0,107],
+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")},239,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,466,160,[],161,[]],
+nn:[function(){this.Qj()},"call$0","gH1",0,0,112],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -13442,7 +14175,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,418,[],416,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,467,[],465,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -13454,12 +14187,12 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,418,[],416,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,467,[],465,[]]},
 dq:{
 "^":"YR;Em,Sb",
 Ml:[function(a,b){var z=this.Em
 if(z>0){this.Em=z-1
-return}b.Rg(0,a)},"call$2","gOa",4,0,null,418,[],416,[]],
+return}b.Rg(0,a)},"call$2","gOa",4,0,null,467,[],465,[]],
 U6:function(a,b,c){},
 $asYR:function(a){return[a,a]},
 $asqh:null},
@@ -13491,101 +14224,101 @@
 c1:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,146,[],155,[],156,[]],
+return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,151,[],160,[],161,[]],
 Vn:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,146,[],110,[]],
+return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,151,[],115,[]],
 qG:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,146,[],110,[],168,[]],
+return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,151,[],115,[],173,[]],
 nA:[function(a,b,c,d){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,146,[],110,[],54,[],55,[]],
+return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,151,[],115,[],54,[],55,[]],
 TE:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gFh(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,146,[],110,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,151,[],115,[]],
 V6:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gXp(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,146,[],110,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,151,[],115,[]],
 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,146,[],110,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,151,[],115,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
 x=z.geT(z)
-y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,146,[],110,[]],
+y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,151,[],115,[]],
 pX:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,146,[],162,[],110,[]],
+return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,151,[],167,[],115,[]],
 RB:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,146,[],176,[]],
+y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,151,[],181,[]],
 ld:[function(a,b,c){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.giq()==null;)z=z.geT(z)
 x=z.geT(z)
-return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,146,[],179,[],180,[]]},
+return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,151,[],184,[],185,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,419,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,468,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$1","gCF",2,0,null,110,[]],
+return this.hk(z,y)}},"call$1","gSI",2,0,null,115,[]],
 m1:[function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$2","gNY",4,0,null,110,[],168,[]],
+return this.hk(z,y)}},"call$2","gNY",4,0,null,115,[],173,[]],
 z8:[function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$3","gLG",6,0,null,110,[],54,[],55,[]],
+return this.hk(z,y)}},"call$3","gLG",6,0,null,115,[],54,[],55,[]],
 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,110,[],420,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,336,115,[],469,[]],
 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,110,[],420,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,336,115,[],469,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.pV(this,z)},"call$2$runGuarded","gzg",2,3,null,333,110,[],420,[]]},
+else return new P.pV(this,z)},"call$2$runGuarded","gzg",2,3,null,336,115,[],469,[]]},
 TF:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:108;c,d",
+"^":"Tp:113;c,d",
 call$0:[function(){return this.c.Gr(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,168,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,173,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:225;c,d",
-call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,168,[],"call"],
+"^":"Tp:107;c,d",
+call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,173,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
 $isEH:true},
 pV:{
-"^":"Tp:343;c,d",
+"^":"Tp:346;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
 $isEH:true},
 uo:{
@@ -13596,23 +14329,23 @@
 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,42,[]],
-hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,155,[],156,[]],
-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,77,77,179,[],180,[]],
-Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,110,[]],
-FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,110,[],168,[]],
-mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,110,[],54,[],55,[]],
-Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,110,[]],
-cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,110,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,110,[]],
-wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,110,[]],
-uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,162,[],110,[]],
-Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,176,[]]},
+hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
+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,77,77,184,[],185,[]],
+Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,115,[]],
+FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
+mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
+Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,115,[]],
+cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,115,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,115,[]],
+wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,115,[]],
+uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
+Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,181,[]]},
 pK:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){P.IA(new P.eM(this.a,this.b))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:108;c,d",
+"^":"Tp:113;c,d",
 call$0:[function(){var z,y,x
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
@@ -13624,7 +14357,7 @@
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:385;a",
+"^":"Tp:436;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,42,[],23,[],"call"],
 $isEH:true},
@@ -13658,23 +14391,23 @@
 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,419,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,468,[]],
 t:[function(a,b){return},"call$1","gIA",2,0,null,42,[]],
-hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,155,[],156,[]],
-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,77,77,179,[],180,[]],
-Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,110,[]],
-FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,110,[],168,[]],
-mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,110,[],54,[],55,[]],
-Al:[function(a){return a},"call$1","gFh",2,0,null,110,[]],
-cR:[function(a){return a},"call$1","gXp",2,0,null,110,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,110,[]],
-wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,110,[]],
-uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,162,[],110,[]],
+hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
+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,77,77,184,[],185,[]],
+Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,115,[]],
+FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
+mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
+Al:[function(a){return a},"call$1","gFh",2,0,null,115,[]],
+cR:[function(a){return a},"call$1","gXp",2,0,null,115,[]],
+O8:[function(a){return a},"call$1","gaj",2,0,null,115,[]],
+wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,115,[]],
+uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
 Ch:[function(a,b){H.qw(b)
-return},"call$1","gJS",2,0,null,176,[]]}}],["dart.collection","dart:collection",,P,{
+return},"call$1","gJS",2,0,null,181,[]]}}],["dart.collection","dart:collection",,P,{
 "^":"",
-Ou:[function(a,b){return J.de(a,b)},"call$2","iv",4,0,182,123,[],183,[]],
-T9:[function(a){return J.v1(a)},"call$1","py",2,0,184,123,[]],
+Ou:[function(a,b){return J.de(a,b)},"call$2","iv",4,0,187,128,[],188,[]],
+T9:[function(a){return J.v1(a)},"call$1","py",2,0,189,128,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -13689,7 +14422,7 @@
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"call$1","Zw",2,0,null,109,[]],
+return y.vM},"call$1","Zw",2,0,null,114,[]],
 Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
@@ -13722,7 +14455,7 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"call$2","zE",4,0,null,109,[],185,[]],
+b.push(v)},"call$2","zE",4,0,null,114,[],190,[]],
 L5:function(a,b,c,d,e){if(b==null){if(a==null)return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])
 b=P.py()}else{if(P.J2()===b&&P.N3()===a)return H.VM(new P.ey(0,null,null,null,null,null,0),[d,e])
 if(a==null)a=P.iv()}return P.Ex(a,b,c,d,e)},
@@ -13737,7 +14470,7 @@
 J.kH(a,new P.ZQ(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"call$1","DH",2,0,null,186,[]],
+z.pop()}return y.gvM()},"call$1","DH",2,0,null,191,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -13803,7 +14536,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,378,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -13824,33 +14557,33 @@
 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,181,[],42,[],23,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
 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,181,[],42,[]],
+return z}else return},"call$2","got",4,0,null,186,[],42,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
 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,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,181,[],42,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","Nk",6,0,null,181,[],42,[],23,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,186,[],42,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,186,[],42,[],23,[]],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:225;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -13864,7 +14597,7 @@
 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,421,[],42,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
 C2:function(a,b){return this.m6.call$2(a,b)},
@@ -13881,14 +14614,14 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 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:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,274,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -13898,12 +14631,12 @@
 z=new P.EQ(z,z.Ig(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,124,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
 aN:[function(a,b){var z,y,x,w
 z=this.Fb
 y=z.Ig()
 for(x=y.length,w=0;w<x;++w){b.call$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,110,[]],
+if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,115,[]],
 $isyN:true},
 EQ:{
 "^":"a;Fb,wV,zi,fD",
@@ -13964,7 +14697,7 @@
 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,42,[],423,[]],
+return z},"call$2","gMs",4,0,null,42,[],472,[]],
 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)
@@ -13988,17 +14721,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,378,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
 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,181,[],42,[],23,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
 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,181,[],42,[]],
+return z.gS4()},"call$2","got",4,0,null,186,[],42,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14016,13 +14749,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,424,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
 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,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14031,12 +14764,12 @@
 delete z["<non-identifier-key>"]
 return z},"call$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:225;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
@@ -14050,7 +14783,7 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y].gkh()
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,421,[],42,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
 xd:{
 "^":"YB;m6,Q6,ac,X5,vv,OX,OB,H9,lX,zN",
 C2:function(a,b){return this.m6.call$2(a,b)},
@@ -14067,13 +14800,13 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(this.C2(a[y].gkh(),b)===!0)return y
-return-1},"call$2","gSP",4,0,null,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 static:{Ex:function(a,b,c,d,e){var z=new P.v6(d)
 return H.VM(new P.xd(a,b,z,0,null,null,null,null,null,0),[d,e])}}},
 v6:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,274,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 db:{
 "^":"a;kh<,S4@,DG@,zQ@"},
@@ -14087,14 +14820,14 @@
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.zq=z.H9
 return y},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,124,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
 aN:[function(a,b){var z,y,x
 z=this.Fb
 y=z.H9
 x=z.zN
 for(;y!=null;){b.call$1(y.gkh())
 if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},"call$1","gjw",2,0,null,110,[]],
+y=y.gDG()}},"call$1","gjw",2,0,null,115,[]],
 $isyN:true},
 N6:{
 "^":"a;Fb,zN,zq,fD",
@@ -14152,9 +14885,9 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(b)}this.X5=this.X5+1
 this.DM=null
-return!0}},"call$1","ght",2,0,null,124,[]],
+return!0}},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,425,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
 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)
@@ -14195,17 +14928,17 @@
 a[b]=0
 this.X5=this.X5+1
 this.DM=null
-return!0},"call$2","gLa",4,0,null,181,[],124,[]],
+return!0},"call$2","gLa",4,0,null,186,[],129,[]],
 Nv:[function(a,b){if(a!=null&&a[b]!=null){delete a[b]
 this.X5=this.X5-1
 this.DM=null
-return!0}else return!1},"call$2","got",4,0,null,181,[],124,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,124,[]],
+return!0}else return!1},"call$2","got",4,0,null,186,[],129,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
 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],b))return y
-return-1},"call$2","gSP",4,0,null,421,[],124,[]],
+return-1},"call$2","gSP",4,0,null,470,[],129,[]],
 $isyN:true,
 $iscX:true,
 $ascX:null},
@@ -14216,7 +14949,7 @@
 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,421,[],124,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],129,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14260,7 +14993,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,378,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -14284,9 +15017,9 @@
 u=w[v]
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
-u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,124,[]],
+u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,425,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
 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)
@@ -14306,14 +15039,14 @@
 this.zN=this.zN+1&67108863}},"call$0","gyP",0,0,null],
 cA:[function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
-return!0},"call$2","gLa",4,0,null,181,[],124,[]],
+return!0},"call$2","gLa",4,0,null,186,[],129,[]],
 Nv:[function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
 this.Vb(z)
 delete a[b]
-return!0},"call$2","got",4,0,null,181,[],124,[]],
+return!0},"call$2","got",4,0,null,186,[],129,[]],
 xf:[function(a){var z,y
 z=new P.ef(a,null,null)
 if(this.H9==null){this.lX=z
@@ -14322,7 +15055,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$1","gTM",2,0,null,124,[]],
+return z},"call$1","gTM",2,0,null,129,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14331,13 +15064,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,424,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,124,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
 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,421,[],124,[]],
+return-1},"call$2","gSP",4,0,null,470,[],129,[]],
 $isyN:true,
 $iscX:true,
 $ascX:null},
@@ -14366,20 +15099,20 @@
 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,"gRV",0,3,null,336,337,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
 $isyN:true,
 $iscX:true,
 $ascX:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,110,[]],
-ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,110,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
+ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
 tg:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
-return!1},"call$1","gdj",2,0,null,124,[]],
+return!1},"call$1","gdj",2,0,null,129,[]],
 aN:[function(a,b){var z
-for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,110,[]],
+for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,115,[]],
 zV:[function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
@@ -14389,18 +15122,18 @@
 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","gnr",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gnr",0,2,null,333,334,[]],
 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,110,[]],
-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,[]],
+return!1},"call$1","gG2",2,0,null,115,[]],
+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,336,337,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,289,[]],
+eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,292,[]],
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(new P.lj("No elements"))
@@ -14409,7 +15142,7 @@
 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,77,379,[],426,[]],
+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,77,430,[],475,[]],
 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()
@@ -14435,7 +15168,7 @@
 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,378,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,429,[]],
 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"))
@@ -14448,21 +15181,21 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,124,[]],
+if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,129,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(a)
 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,379,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,430,[]],
 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","gnr",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,379,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,110,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,122,[]],
+return z.vM},"call$1","gnr",0,2,null,333,334,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,430,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
+eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,127,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
@@ -14475,15 +15208,15 @@
 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,"gRV",0,3,null,336,337,[]],
 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,124,[]],
+this.u(a,z,b)},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z,y,x
 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,109,[]],
+this.u(a,x,y)}},"call$1","gDY",2,0,null,114,[]],
 Rz:[function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
@@ -14491,13 +15224,13 @@
 if(!(z<y))break
 if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},"call$1","gRI",2,0,null,124,[]],
+return!0}++z}return!1},"call$1","gRI",2,0,null,129,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,77,128,[]],
+GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,77,133,[]],
 pZ:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gbI",4,0,null,115,[],116,[]],
+if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gbI",4,0,null,120,[],121,[]],
 D6:[function(a,b,c){var z,y,x,w
 if(c==null)c=this.gB(a)
 this.pZ(a,b,c)
@@ -14508,9 +15241,9 @@
 x=0
 for(;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,115,[],116,[]],
+y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,115,[],116,[]],
+return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14527,7 +15260,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,115,[],116,[],109,[],117,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14536,11 +15269,11 @@
 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,124,[],80,[]],
+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,335,129,[],80,[]],
 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,"gph",2,2,null,77,124,[],80,[]],
+return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],80,[]],
 xe:[function(a,b,c){var z
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14549,7 +15282,7 @@
 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,47,[],124,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
 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))
@@ -14567,14 +15300,14 @@
 $iscX:true,
 $ascX:null},
 ZQ:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;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,427,[],274,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,402,[],277,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -14586,7 +15319,7 @@
 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,378,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
 gl0:function(a){return this.av===this.eZ},
 gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
 grZ:function(a){var z,y
@@ -14612,8 +15345,8 @@
 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.e4(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,124,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
 if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=z.gB(b)
@@ -14639,7 +15372,7 @@
 H.Og(w,z,z+s,b,0)
 z=this.v5
 H.Og(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,428,[]],
+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,476,[]],
 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)
@@ -14662,7 +15395,7 @@
 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,124,[]],
+this.qT=this.qT+1},"call$1","gXk",2,0,null,129,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
 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
@@ -14680,7 +15413,7 @@
 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,429,[]],
+return a}},"call$1","gzv",2,0,null,477,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -14725,7 +15458,7 @@
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"call$1","W5",2,0,null,187,[]]}},
+if(z===0)return a}},"call$1","bD",2,0,null,192,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -14786,7 +15519,7 @@
 return v},"call$1","gST",2,0,null,42,[]],
 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","gOv",2,0,null,261,[]],
+y.Bb=z}return z},"call$1","gOv",2,0,null,264,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -14809,12 +15542,12 @@
 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,261,[],430,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,264,[],478,[]]},
 Ba:{
 "^":"vX;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,431,[],432,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gcd",4,0,null,479,[],480,[]],
 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
@@ -14838,7 +15571,7 @@
 y.Qf(this,[P.qv,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
-b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,110,[]],
+b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,115,[]],
 gB:function(a){return this.P6},
 V1:[function(a){this.aY=null
 this.P6=0
@@ -14859,9 +15592,9 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,274,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
@@ -14869,13 +15602,13 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 LD:{
-"^":"Tp:433;a,b,c",
+"^":"Tp:481;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,261,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,264,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -14884,7 +15617,7 @@
 return this.Wb(z)},
 WV:[function(a){var z
 for(z=this.Ln;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,261,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,264,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -14926,32 +15659,35 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,261,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,264,[]]},
 ZM:{
 "^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,261,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,264,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,261,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,264,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,188,[],189,[]],
+return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,193,[],194,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H44",4,0,null,27,[],189,[]],
-tp:[function(a){return a.Lt()},"call$1","BC",2,0,190,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H44",4,0,null,27,[],194,[]],
+tp:[function(a){return a.Lt()},"call$1","BC",2,0,195,6,[]],
+Md:[function(a){a.i(0,64512)
+return!1},"call$1","bO",2,0,null,13,[]],
+ZZ:[function(a,b){return(65536+(a.i(0,1023)<<10>>>0)|b&1023)>>>0},"call$2","hz",4,0,null,198,[],199,[]],
 JC:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 call$2:[function(a,b){return b},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -14971,18 +15707,18 @@
 "^":"Uk;",
 $asUk:function(){return[J.O,[J.Q,J.im]]}},
 Ud:{
-"^":"Ge;Ct,FN",
+"^":"Ge;Pc,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
 else return"Converting object did not return an encodable object."},"call$0","gXo",0,0,null],
 static:{ox:function(a,b){return new P.Ud(a,b)}}},
 K8:{
-"^":"Ud;Ct,FN",
+"^":"Ud;Pc,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"call$0","gXo",0,0,null],
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-pW:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.pW(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,77,27,[],189,[]],
-PN:[function(a,b){return P.Vg(a,this.gZE().Xi)},function(a){return this.PN(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,77,23,[],191,[]],
+pW:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.pW(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,77,27,[],194,[]],
+PN:[function(a,b){return P.Vg(a,this.gZE().Xi)},function(a){return this.PN(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,77,23,[],196,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
@@ -15039,11 +15775,11 @@
 w.KF("}")
 this.JN.Rz(0,a)
 return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,IE,Yz,No,fg,SW,KQz,MU,ql,NXu,CE,QVv",Vg:[function(a,b){var z
+static:{"^":"P3,Ib,IE,Yz,ij,fg,SW,KQz,MU,ql,NXu,CE,QVv",Vg:[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","ab",4,0,null,6,[],191,[]],NY:[function(a,b){var z,y,x,w,v,u,t
+return z.vM},"call$2","ab",4,0,null,6,[],196,[]],NY:[function(a,b){var z,y,x,w,v,u,t
 z=J.U6(b)
 y=z.gB(b)
 x=H.VM([],[J.im])
@@ -15073,9 +15809,9 @@
 x.push(t<10?48+t:87+t)
 break}w=!0}else if(u===34||u===92){x.push(92)
 x.push(u)
-w=!0}else x.push(u)}a.KF(w?P.HM(x):b)},"call$2","qW",4,0,null,192,[],86,[]]}},
+w=!0}else x.push(u)}a.KF(w?P.HM(x):b)},"call$2","qW",4,0,null,197,[],86,[]]}},
 tF:{
-"^":"Tp:434;a,b",
+"^":"Tp:482;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
@@ -15093,86 +15829,61 @@
 E3:{
 "^":"wI;",
 WJ:[function(a){var z,y,x
-z=J.U6(a)
-y=J.p0(z.gB(a),3)
-if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.im])
+z=a.gB(a)
+y=H.VM(Array(z.U(0,3)),[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)
+x.fJ(a,0,z)
+x.Lb(a.j(0,z.W(0,1)),0)
 return C.Nm.D6(y,0,x.ZP)},"call$1","gmC",2,0,null,26,[]],
 $aswI:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
-"^":"a;WF,ZP,EN",
-Lb:[function(a,b){var z,y,x,w,v
-z=this.EN
+"^":"a;vn,ZP,EN",
+Lb:[function(a,b){var z,y,x,w
+if((b&64512)===56320)P.ZZ(a,b)
+else{z=this.EN
 y=this.ZP
-if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
-w=y+1
-this.ZP=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=(240|x>>>18)>>>0
-y=w+1
-this.ZP=y
-if(w>=v)return H.e(z,w)
-z[w]=128|x>>>12&63
-w=y+1
-this.ZP=w
-if(y>=v)return H.e(z,y)
-z[y]=128|x>>>6&63
-this.ZP=w+1
-if(w>=v)return H.e(z,w)
-z[w]=128|x&63
-return!0}else{w=y+1
-this.ZP=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=224|a>>>12
-y=w+1
-this.ZP=y
-if(w>=v)return H.e(z,w)
-z[w]=128|a>>>6&63
 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,435,[],436,[]],
-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)
-z=this.EN
-y=z.length
-x=J.rY(a)
-w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.ZP
-if(u>=y)break
+x=C.jn.k(224,a.m(0,12))
+w=z.length
+if(y>=w)return H.e(z,y)
+z[y]=x
+x=this.ZP
+this.ZP=x+1
+y=a.m(0,6).i(0,63)
+if(x>=w)return H.e(z,x)
+z[x]=128|y
+y=this.ZP
+this.ZP=y+1
+x=a.i(0,63)
+if(y>=w)return H.e(z,y)
+z[y]=128|x
+return!1}},"call$2","gkL",4,0,null,483,[],484,[]],
+fJ:[function(a,b,c){var z,y,x,w,v,u
+P.Md(a.j(0,c.W(0,1)))
+for(z=this.EN,y=z.length,x=b;C.jn.C(x,c);++x){w=a.j(0,x)
+w.E(0,127)
+P.Md(w)
+w.E(0,2047)
+v=this.ZP
+if(v+2>=y)break
+this.ZP=v+1
+u=C.jn.k(224,w.m(0,12))
+if(v>=y)return H.e(z,v)
+z[v]=u
+u=this.ZP
 this.ZP=u+1
-z[u]=v}else if((v&64512)===55296){if(this.ZP+3>=y)break
-t=w+1
-if(this.Lb(v,x.j(a,t)))w=t}else if(v<=2047){u=this.ZP
-s=u+1
-if(s>=y)break
-this.ZP=s
+v=w.m(0,6).i(0,63)
 if(u>=y)return H.e(z,u)
-z[u]=192|v>>>6
-this.ZP=s+1
-z[s]=128|v&63}else{u=this.ZP
-if(u+2>=y)break
-s=u+1
-this.ZP=s
-if(u>=y)return H.e(z,u)
-z[u]=224|v>>>12
-u=s+1
-this.ZP=u
-if(s>=y)return H.e(z,s)
-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,[],115,[],116,[]],
+z[u]=128|v
+v=this.ZP
+this.ZP=v+1
+u=w.i(0,63)
+if(v>=y)return H.e(z,v)
+z[v]=128|u}return x},"call$3","gkH",6,0,null,339,[],120,[],121,[]],
 static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:[function(a){return},"call$1","PM",2,0,null,44,[]],
-Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,193,123,[],183,[]],
+Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,200,128,[],188,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -15198,9 +15909,9 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"call$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,195,123,[],183,[]],
-xv:[function(a){return H.CU(a)},"call$1","J2",2,0,196,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,197,77,77,27,[],159,[],28,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,202,128,[],188,[]],
+xv:[function(a){return H.CU(a)},"call$1","J2",2,0,203,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,204,77,77,27,[],164,[],28,[]],
 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
@@ -15221,15 +15932,15 @@
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.call$1(z)},"call$1","Pl",2,0,null,6,[]],
+else y.call$1(z)},"call$1","Qki",2,0,null,6,[]],
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,129,[],23,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,134,[],23,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:385;a",
+"^":"Tp:436;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -15244,7 +15955,7 @@
 "^":"a;",
 bu:[function(a){return this?"true":"false"},"call$0","gXo",0,0,null],
 $isbool:true},
-Tx:{
+Rz:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
@@ -15269,11 +15980,11 @@
 q=new P.Zl().call$1(z)
 if(y)return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)+"Z"
 else return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)},"call$0","gXo",0,0,null],
-h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,162,[]],
+h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,167,[]],
 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,h2,pa,EQe,NXt,tp1,Gi,k3,cR,E03,fH,Ne,r2,bmS,FI,Kz,EF,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+static:{"^":"aV,bI,dfk,Kw,h2,mo,EQe,NXt,tp1,Xs,k3,cR,Oq,fH,Ne,Nr,bmS,lX,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=new H.VR(H.v4("^([+-]?\\d?\\d\\d\\d\\d)-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?\\+00(?::?00)?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -15296,48 +16007,50 @@
 if(8>=x.length)return H.e(x,8)
 o=x[8]!=null
 n=H.zW(w,v,u,t,s,r,q,o)
-return P.Wu(p?n+1:n,o)}else throw H.b(P.cD(a))},"call$1","lel",2,0,null,194,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?n+1:n,o)}else throw H.b(P.cD(a))},"call$1","zZ",2,0,null,201,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
+return z},Gi:function(){var z=new P.iP(Date.now(),!1)
+z.EK()
 return z}}},
 MF:{
-"^":"Tp:438;",
+"^":"Tp:486;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,437,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:439;",
+"^":"Tp:487;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,437,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 Hn:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"call$1",null,2,0,null,289,[],"call"],
+return y+"000"+H.d(z)},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 Zl:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"call$1",null,2,0,null,289,[],"call"],
+return"00"+a},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 B5:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,289,[],"call"],
+return"0"+a},"call$1",null,2,0,null,292,[],"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,104,[]],
 W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,104,[]],
 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,440,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,488,[]],
 Z:[function(a,b){if(b===0)throw H.b(P.zl())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","gdG",2,0,null,441,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,489,[]],
 C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,104,[]],
 D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,104,[]],
 E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gf5",2,0,null,104,[]],
@@ -15361,18 +16074,18 @@
 $isa6:true,
 static:{"^":"Kl,S4d,dk,uU,RD,b2,q9,ll,Do,f4,kTB,IJZ,iI,Vk,Nw,yn",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:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
 if(a>=100)return"000"+a
 if(a>=10)return"0000"+a
-return"00000"+a},"call$1",null,2,0,null,289,[],"call"],
+return"00000"+a},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,289,[],"call"],
+return"0"+a},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -15395,7 +16108,7 @@
 "^":"Ge;",
 static:{hS:function(){return new P.Np()}}},
 mp:{
-"^":"Ge;uF,UP,mP,SA,mZ",
+"^":"Ge;uF,UP,mP,SA,FZ",
 bu:[function(a){var z,y,x,w,v,u,t
 z={}
 z.a=P.p9("")
@@ -15475,7 +16188,7 @@
 "^":"a;",
 $iscX:true,
 $ascX:null},
-Yl:{
+AC:{
 "^":"a;"},
 Z0:{
 "^":"a;",
@@ -15488,7 +16201,7 @@
 n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,104,[]],
 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,328,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -15533,7 +16246,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","gS9",2,2,null,330,425,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gS9",2,2,null,333,474,[],334,[]],
 V1:[function(a){this.vM=""},"call$0","gyP",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
@@ -15548,7 +16261,7 @@
 "^":"a;",
 $isuq:true},
 iD:{
-"^":"a;NN,HC,r0,Fi,ku,tP,Ka,YG,yW",
+"^":"a;NN,HC,r0,Fi,ku,tP,Ka,hO,yW",
 gWu:function(){if(J.de(this.gJf(this),""))return""
 var z=P.p9("")
 this.tb(z)
@@ -15571,13 +16284,13 @@
 if(!J.de(this.gJf(this),"")||J.de(this.Fi,"file")){z=J.U6(y)
 z=z.gor(y)&&!z.nC(y,"/")}else z=!1
 if(z)return"/"+H.d(y)
-return y},"call$2","gbQ",4,0,null,262,[],442,[]],
+return y},"call$2","gbQ",4,0,null,265,[],490,[]],
 Ky:[function(a,b){var z=J.x(a)
 if(z.n(a,""))return"/"+H.d(b)
-return z.Nj(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},"call$2","gAj",4,0,null,443,[],444,[]],
+return z.Nj(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},"call$2","gAj",4,0,null,491,[],492,[]],
 uo:[function(a){var z=J.U6(a)
 if(J.z8(z.gB(a),0)&&z.j(a,0)===58)return!0
-return z.u8(a,"/.")!==-1},"call$1","gaO",2,0,null,262,[]],
+return z.u8(a,"/.")!==-1},"call$1","gaO",2,0,null,265,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
@@ -15590,13 +16303,13 @@
 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,262,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,265,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}z=this.NN
 a.KF(z==null?"null":z)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,445,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,493,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
@@ -15621,7 +16334,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"Um,B4,Bx,iR,OO,My,nR,jJY,d2,Qq,q7,ux,zk,SF,fd,IL,Q5,Pa,yt,fC,O5,eq,qf,ML,y3,Pk,R1,qs,lL,I9,t2,H5,wb,eK,ws,Sp,jH,Qd,Ai,ne",r6:function(a){var z,y,x,w,v,u,t,s
+static:{"^":"Um,B4,Bx,iR,OO,My,nR,jJY,d2,n2,q7,ux,vI,SF,fd,IL,Q5,zk,yt,fC,Ft,eq,qf,ML,y3,Pk,R1,qs,lL,I9,t2,H5,wb,eK,ws,Sp,aJ,Qd,Ai,ne",r6:function(a){var z,y,x,w,v,u,t,s
 z=a.QK
 if(1>=z.length)return H.e(z,1)
 y=z[1]
@@ -15662,7 +16375,7 @@
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
 if(z.j(a,y)===58){P.eg(a)
-return"["+H.d(a)+"]"}++y}return a},"call$1","jC",2,0,null,198,[]],iy:[function(a){var z,y,x,w,v,u,t,s
+return"["+H.d(a)+"]"}++y}return a},"call$1","jC",2,0,null,205,[]],iy:[function(a){var z,y,x,w,v,u,t,s
 z=new P.hb()
 y=new P.XX()
 if(a==null)return""
@@ -15677,7 +16390,7 @@
 s=!s}else s=!1
 if(s)throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
 if(z.call$1(t)!==!0){if(y.call$1(t)===!0);else throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
-v=!1}}return v?a:x.hc(a)},"call$1","oL",2,0,null,199,[]],LE:[function(a,b){var z,y,x
+v=!1}}return v?a:x.hc(a)},"call$1","oL",2,0,null,206,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -15686,8 +16399,8 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"call$2","wF",4,0,null,200,[],201,[]],UJ:[function(a){if(a==null)return""
-return P.Xc(a)},"call$1","p7",2,0,null,202,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return x.vM},"call$2","wF",4,0,null,207,[],208,[]],UJ:[function(a){if(a==null)return""
+return P.Xc(a)},"call$1","p7",2,0,null,209,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z={}
 y=new P.Gs()
 x=new P.Tw()
@@ -15734,14 +16447,14 @@
 r=n}if(z.a!=null&&z.c!==r)s.call$0()
 z=z.a
 if(z==null)return a
-return J.AG(z)},"call$1","Sy",2,0,null,203,[]],n7:[function(a){if(a!=null&&!J.de(a,""))return H.BU(a,null,null)
-else return 0},"call$1","dl",2,0,null,204,[]],K6:[function(a,b){if(a!=null)return a
+return J.AG(z)},"call$1","Sy",2,0,null,210,[]],n7:[function(a){if(a!=null&&!J.de(a,""))return H.BU(a,null,null)
+else return 0},"call$1","dl",2,0,null,211,[]],K6:[function(a,b){if(a!=null)return a
 if(b!=null)return b
-return""},"call$2","xX",4,0,null,205,[],206,[]],q5:[function(a){var z,y
+return""},"call$2","xX",4,0,null,212,[],213,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.call$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,198,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,205,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.u6(J.q8(a),2))z.call$1("address is too short")
@@ -15762,7 +16475,7 @@
 q=J.de(J.MQ(x),-1)
 if(r&&!q)z.call$1("expected a part after last `:`")
 if(!r)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(p){H.Ru(p)
-try{v=P.q5(J.ZZ(a,w))
+try{v=P.q5(J.D8(a,w))
 s=J.c1(J.UQ(v,0),8)
 o=J.UQ(v,1)
 if(typeof o!=="number")return H.s(o)
@@ -15774,7 +16487,7 @@
 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","y9",2,0,null,198,[]],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,205,[]],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)
@@ -15790,29 +16503,29 @@
 y.vM=y.vM+u}else{s=P.O8(1,37,J.im)
 u=H.eT(s)
 y.vM=y.vM+u
-z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,207,147,208,[],209,[],210,[],211,[]]}},
+z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,214,152,215,[],216,[],217,[],218,[]]}},
 hb:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 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,446,[],"call"],
+return z},"call$1",null,2,0,null,494,[],"call"],
 $isEH:true},
 XX:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.mK,z)
 z=(C.mK[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,446,[],"call"],
+return z},"call$1",null,2,0,null,494,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -15823,26 +16536,26 @@
 z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 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,448,[],"call"],
+return z},"call$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:447;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:495;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 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,446,[],"call"],
+return z},"call$1",null,2,0,null,494,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:449;b,c,d",
+"^":"Tp:497;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=J.lE(z,a)
@@ -15851,7 +16564,7 @@
 else return y},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:449;e",
+"^":"Tp:497;e",
 call$1:[function(a){var z,y,x,w,v
 for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
 if(48<=v&&v<=57)x=x*16+v-48
@@ -15860,7 +16573,7 @@
 else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+H.d(z)))}}return x},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:107;a,f",
+"^":"Tp:112;a,f",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.a
@@ -15871,54 +16584,54 @@
 else y.KF(J.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:451;",
+"^":"Tp:499;",
 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,450,[],242,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,498,[],245,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:177;",
+"^":"Tp:182;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,452,[],"call"],
+return z},"call$1",null,2,0,null,500,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:177;",
+"^":"Tp:182;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:453;a,b",
+"^":"Tp:501;a,b",
 call$2:[function(a,b){var z,y
 if(J.z8(J.xH(b,a),4))this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(J.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.call$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"call$2",null,4,0,null,115,[],116,[],"call"],
+return z},"call$2",null,4,0,null,120,[],121,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:225;c",
+"^":"Tp:107;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,23,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 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,454,[],455,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,502,[],503,[],"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,212,18,[]],
-r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,94,[],213,[]],
-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,77,77,214,[],215,[],216,[]],
+return"transitionend"},"call$1","pq",2,0,219,18,[]],
+r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,94,[],220,[]],
+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,77,77,221,[],222,[],223,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -15929,7 +16642,7 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,77,77,77,77,77,77,77,214,[],217,[],218,[],215,[],219,[],220,[],221,[],216,[]],
+return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,77,77,77,77,77,77,77,221,[],224,[],225,[],222,[],226,[],227,[],228,[],223,[]],
 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},
@@ -15937,9 +16650,9 @@
 try{z=a
 y=J.x(z)
 return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","iJ",2,0,null,222,[]],
+return!1}},"call$1","EF",2,0,null,229,[]],
 Pv:[function(a){if(a==null)return
-return W.P1(a)},"call$1","Ie",2,0,null,223,[]],
+return W.P1(a)},"call$1","Ie",2,0,null,230,[]],
 qc:[function(a){var z,y
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
@@ -15947,10 +16660,13 @@
 if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
 return}else return a},"call$1","Wq",2,0,null,18,[]],
 qr:[function(a){return a},"call$1","Ku",2,0,null,18,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,224,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,225,41,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,225,41,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,226,41,[],12,[],227,[],228,[]],
+Z9:[function(a){var z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+return P.o7(a,!0)},"call$1","cj",2,0,null,91,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,231,[],7,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,107,41,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,107,41,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,232,41,[],12,[],233,[],234,[]],
 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))
@@ -15989,16 +16705,16 @@
 Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
 q={prototype: s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"call$5","uz",10,0,null,89,[],229,[],94,[],11,[],230,[]],
+b.registerElement(c,q)},"call$5","uz",10,0,null,89,[],235,[],94,[],11,[],236,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,151,[]],
+return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,156,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,151,[]],
+return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,156,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|LP|uL|Vf|G6|Ds|xI|Tg|pv|Ps|CN|Vfx|vc|Dsd|E0|Nr|lw|tuj|Fv|Vct|E9|m8|D13|Gk|AX|WZq|yb|pva|NM|pR|cda|hx|u7|waa|E7|V0|St|V4|vj|LU|V10|T2|PF|F1|V11|aQ|V12|Qa|V13|vI|V14|tz|V15|fl|V16|Zt|V17|wM|V18|lI|XP|JG|T5|knI|V19|fI|V20|nm|V21|Vu"},
-ho:{
+"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Vf|PO|Ur|G6|Sq|xI|Tg|KU|Ps|CN|qbd|HT|Ds|E0|LP|lw|pv|Fv|Vfx|E9|m8|Urj|Gk|AX|oub|yb|c4r|NM|pR|Squ|hx|Dsd|Zt|u7|KUl|E7|Kz|tuj|vj|LU|mHk|T2|Vct|PF|F1|D13|aQ|WZq|Ya5|pva|Ww|cda|tz|qFb|fl|rna|oM|Vba|wM|waa|lI|XP|V0|JG|T5|knI|oaa|fI|q2|nm|q3|uwf"},
+pa:{
 "^":"Gv;",
 $isList:true,
 $asWO:function(){return[W.M5]},
@@ -16039,11 +16755,11 @@
 "^":"KV;Rn:data=,B:length=",
 $isGv:true,
 "%":"Comment;CharacterData"},
-QQS:{
+Yr:{
 "^":"ea;tT:code=",
 "%":"CloseEvent"},
 di:{
-"^":"Mf;Rn:data=",
+"^":"Qa;Rn:data=",
 "%":"CompositionEvent"},
 He:{
 "^":"ea;",
@@ -16058,14 +16774,14 @@
 QF:{
 "^":"KV;",
 JP:[function(a){return a.createDocumentFragment()},"call$0","gf8",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,290,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,77,261,[],291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,77,264,[],294,[]],
 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,292,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,293,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,293,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16078,9 +16794,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,292,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,293,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,293,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
 $isGv:true,
 "%":";DocumentFragment"},
 cm:{
@@ -16096,7 +16812,7 @@
 $isNh:true,
 "%":"DOMException"},
 cv:{
-"^":"KV;xr:className%,jO:id%",
+"^":"KV;xr:className%,jO:id=",
 gQg:function(a){return new W.i7(a)},
 gwd:function(a){return new W.VG(a,a.children)},
 swd:function(a,b){var z,y
@@ -16104,13 +16820,13 @@
 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,292,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,293,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,293,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
 gDD:function(a){return new W.I4(a)},
 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,[],227,[],228,[]],
+aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
 gqn:function(a){return a.localName},
 bu:[function(a){return a.localName},"call$0","gXo",0,0,null],
 WO:[function(a,b){if(!!a.matches)return a.matches(b)
@@ -16118,11 +16834,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,292,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,295,[]],
 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,292,[]],
+return!1},"call$1","gMn",2,0,null,295,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
 gKE:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
@@ -16148,8 +16864,8 @@
 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,77,11,[],294,[],295,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,77,11,[],294,[],295,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16162,7 +16878,7 @@
 Aa:{
 "^":"cm;tT:code=",
 "%":"FileError"},
-h4:{
+Tq:{
 "^":"qE;B:length=,bP:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
 wa:{
@@ -16187,8 +16903,9 @@
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
 "^":"rk;iC:responseText=,ys:status=,po:statusText=",
-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,"gcY",4,7,null,77,77,77,217,[],214,[],296,[],297,[],298,[]],
-wR:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,77,233,[]],
+gn9:function(a){return W.Z9(a.response)},
+Yh:[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,77,77,77,224,[],221,[],299,[],300,[],301,[]],
+wR:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,77,239,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
 rk:{
@@ -16258,10 +16975,10 @@
 Rv:{
 "^":"D0;jO:id=",
 "%":"MediaStream"},
-DD:{
+Hy:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$isDD:true,
+$isHy:true,
 "%":"MessageEvent"},
 EeC:{
 "^":"qE;jb:content=,oc:name%",
@@ -16275,16 +16992,16 @@
 "%":"MIDIMessageEvent"},
 bn:{
 "^":"Imr;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"wR","call$2",null,"gX8",2,2,null,77,233,[],299,[]],
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"wR","call$2",null,"gX8",2,2,null,77,239,[],302,[]],
 "%":"MIDIOutput"},
 Imr:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
-Oq:{
-"^":"Mf;",
+CX:{
+"^":"Qa;",
 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,[],300,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[]],
-$isOq:true,
+return},"call$15","gEx",30,0,null,11,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[]],
+$isCX:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -16297,9 +17014,9 @@
 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,77,77,77,77,77,77,77,74,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[]],
+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,77,77,77,77,77,77,77,74,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
-o4:{
+FI:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
 oU:{
@@ -16316,13 +17033,13 @@
 if(z!=null)z.removeChild(a)},"call$0","gRI",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,321,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,324,[]],
 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,322,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,325,[]],
 tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,104,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,322,[],323,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,322,[],324,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,325,[],326,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,325,[],327,[]],
 $isKV:true,
 "%":"Entity|Notation;Node"},
 yk:{
@@ -16395,13 +17112,13 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,290,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
 $isI0:true,
 "%":"ShadowRoot"},
 CY:{
 "^":"qE;LA:src=,t5:type%",
 "%":"HTMLSourceElement"},
-zD9:{
+Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
 G5:{
@@ -16421,7 +17138,7 @@
 "^":"qE;",
 $istV:true,
 "%":"HTMLTableRowElement"},
-BT:{
+KP:{
 "^":"qE;",
 gWT:function(a){return H.VM(new W.Of(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
@@ -16439,7 +17156,7 @@
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 xV:{
-"^":"Mf;Rn:data=",
+"^":"Qa;Rn:data=",
 "%":"TextEvent"},
 RH:{
 "^":"qE;fY:kind%,LA:src=",
@@ -16448,7 +17165,7 @@
 "^":"ea;",
 $isOJ:true,
 "%":"TransitionEvent|WebKitTransitionEvent"},
-Mf:{
+Qa:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
 u9:{
@@ -16457,7 +17174,7 @@
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
-oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,151,[]],
+oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,156,[]],
 hr:[function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
@@ -16478,7 +17195,7 @@
 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,77,20,[],325,[],326,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,77,20,[],328,[],329,[]],
 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)},
@@ -16522,16 +17239,16 @@
 "%":"MozNamedAttrMap|NamedNodeMap"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gOu",2,0,456,168,[]],
-Wt:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,456,168,[]],
-To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,168,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,177,457,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,177,457,[]],
-WL:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,456,168,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,504,173,[]],
+Wt:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,504,173,[]],
+To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,173,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,182,505,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,182,505,[]],
+WL:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,504,173,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
-tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,124,[]],
+tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,129,[]],
 gl0:function(a){return this.MW.firstElementChild==null},
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
@@ -16547,9 +17264,9 @@
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
 z=J.x(b)
-for(z=J.GP(typeof b==="object"&&b!==null&&!!z.$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,109,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,77,128,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
+for(z=J.GP(typeof b==="object"&&b!==null&&!!z.$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,77,133,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 Rz:[function(a,b){var z=J.x(b)
 if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
@@ -16561,7 +17278,7 @@
 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,47,[],124,[]],
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,47,[],129,[]],
 V1:[function(a){this.MW.textContent=""},"call$0","gyP",0,0,null],
 KI:[function(a,b){var z,y
 z=this.vG
@@ -16583,7 +17300,7 @@
 return z[b]},"call$1","gIA",2,0,null,47,[]],
 u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,47,[],23,[]],
 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,77,128,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,77,133,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
 gi9:function(a){return C.mt.vo(this)},
@@ -16600,7 +17317,7 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
 return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
@@ -16632,15 +17349,15 @@
 $iscX:true,
 $ascX:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:225;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,458,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,506,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,459,[],23,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,507,[],23,[],"call"],
 $isEH:true},
 bU:{
-"^":"Tp:225;b,c",
+"^":"Tp:107;b,c",
 call$1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -16652,7 +17369,7 @@
 y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:343;a",
+"^":"Tp:346;a",
 call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 e7:{
@@ -16666,7 +17383,7 @@
 if(typeof b==="object"&&b!==null&&!!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,109,[]],
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
 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))
 z=this.NL
@@ -16674,7 +17391,7 @@
 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,47,[],261,[]],
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,47,[],264,[]],
 KI:[function(a,b){var z,y,x
 z=this.NL
 y=z.childNodes
@@ -16695,8 +17412,8 @@
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,47,[],23,[]],
 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,77,128,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,77,133,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 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
@@ -16721,7 +17438,7 @@
 $iscX:true,
 $ascX:function(){return[W.KV]}},
 kI:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
 return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
@@ -16748,7 +17465,7 @@
 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","gyP",0,0,null],
 aN:[function(a,b){var z,y
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,110,[]],
+b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,115,[]],
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[J.O])
@@ -16766,8 +17483,8 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,427,[],274,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,402,[],277,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -16780,7 +17497,7 @@
 z.removeAttribute(b)
 return y},"call$1","gRI",2,0,null,42,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,261,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,264,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16788,38 +17505,38 @@
 return z},"call$0","gt8",0,0,null],
 p5:[function(a){var z,y
 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,86,[]],
-OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,110,[]],
-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,77,23,[],460,[]],
+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","gpJ",2,0,null,86,[]],
+OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,115,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
 Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","gRI",2,0,null,23,[]],
-xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,110,[]],
+xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,115,[]],
 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)
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;a,b",
 call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:343;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,461,[],124,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,509,[],129,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -16828,36 +17545,36 @@
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 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,86,[]]},
+J.Pw(this.MW,a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]},
 e0:{
 "^":"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,147,18,[],295,[]],
-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,147,18,[],295,[]],
-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,147,18,[],295,[]]},
+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,152,18,[],298,[]],
+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,152,18,[],298,[]],
+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,152,18,[],298,[]]},
 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,77,77,77,412,[],406,[],413,[],159,[]]},
+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,77,77,77,461,[],456,[],462,[],164,[]]},
 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,462,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
 $isqh:true},
 ie:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,410,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,18,[],"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,462,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
 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)
@@ -16865,14 +17582,14 @@
 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,77,77,77,412,[],406,[],413,[],159,[]],
+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,77,77,77,461,[],456,[],462,[],164,[]],
 $isqh:true},
 i2:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,410,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
@@ -16885,7 +17602,7 @@
 return},"call$0","gZS",0,0,null],
 nB:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,409,[]],
+this.Ns()},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -16900,32 +17617,32 @@
 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.gXB()))},"call$1","ght",2,0,null,463,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gXB()))},"call$1","ght",2,0,null,511,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","gRI",2,0,null,463,[]],
+if(z!=null)z.ed()},"call$1","gRI",2,0,null,511,[]],
 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)
-this.aV.cO(0)},"call$0","gJK",0,0,107],
+this.aV.cO(0)},"call$0","gJK",0,0,112],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-bO:{
-"^":"a;Vy",
-cN:function(a){return this.Vy.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,147,18,[],295,[]]},
+hP:{
+"^":"a;vm",
+cN:function(a){return this.vm.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,152,18,[],298,[]]},
 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,23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,109,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,77,128,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,47,[],124,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,464,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,114,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,77,133,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,47,[],129,[]],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,512,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gRI",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,115,[],116,[],109,[],117,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isList:true,
 $asWO:null,
 $isyN:true,
@@ -16935,8 +17652,8 @@
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,124,[]],
-Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","gRI",2,0,null,124,[]],
+h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,129,[]],
+Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","gRI",2,0,null,129,[]],
 V1:[function(a){J.U2(this.xa)},"call$0","gyP",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -16945,12 +17662,12 @@
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
 sB:function(a,b){J.wg(this.xa,b)},
-GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,77,128,[]],
-XU:[function(a,b,c){return J.hf(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,124,[],115,[]],
-Pk:[function(a,b,c){return J.pB(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,124,[],115,[]],
-xe:[function(a,b,c){return J.Nv(this.xa,b,c)},"call$2","gQG",4,0,null,47,[],124,[]],
+GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,77,133,[]],
+XU:[function(a,b,c){return J.hf(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],120,[]],
+Pk:[function(a,b,c){return J.pB(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
+xe:[function(a,b,c){return J.Nv(this.xa,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
 KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){J.QQ(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]]},
+YW:[function(a,b,c,d,e){J.QQ(this.xa,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -16967,7 +17684,7 @@
 return!1},"call$0","gqy",0,0,null],
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;a,b",
 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
@@ -16977,14 +17694,14 @@
 "^":"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,77,20,[],325,[],326,[]],
+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,77,20,[],328,[],329,[]],
 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,77,11,[],294,[],295,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,77,11,[],294,[],295,[]],
+On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
+Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
 $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,231,[]]}},
+else return new W.dW(a)},"call$1","lG",2,0,null,237,[]]}},
 Dk:{
 "^":"a;WK",
 gcC:function(a){return this.WK.hash},
@@ -17051,7 +17768,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDiffuseLightingElement"},
-kK:{
+wf:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDisplacementMapElement"},
@@ -17079,11 +17796,11 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEOffsetElement"},
-um:{
+kK:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFESpecularLightingElement"},
-kL:{
+um:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFETileElement"},
@@ -17138,7 +17855,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolygonElement"},
-GH:{
+mO:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolylineElement"},
@@ -17146,7 +17863,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGRectElement"},
-nd:{
+j24:{
 "^":"d5;t5:type%,mH:href=",
 $isGv:true,
 "%":"SVGScriptElement"},
@@ -17169,7 +17886,7 @@
 "%":"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"},
 hy:{
 "^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,290,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
 $ishy:true,
 $isGv:true,
 "%":"SVGSVGElement"},
@@ -17228,7 +17945,7 @@
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},"call$0","gt8",0,0,null],
-p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gVH",2,0,null,86,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
 TM:{
 "^":"Gv;tT:code=,G1:message=",
@@ -17239,11 +17956,11 @@
 $isIU:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","Kc",2,3,null,147,110,[],232,[]],
+xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","Kc",2,3,null,152,115,[],238,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-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,151,[],232,[],164,[],82,[]],
+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,156,[],238,[],169,[],82,[]],
 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,91,[],12,[],23,[]],
@@ -17260,10 +17977,10 @@
 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())
-else return P.hE(a,"_$dart_jsObject",new P.Hp())}}},"call$1","En",2,0,225,91,[]],
+else return P.hE(a,"_$dart_jsObject",new P.Hp())}}},"call$1","En",2,0,107,91,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","nB",6,0,null,91,[],63,[],234,[]],
+P.Dm(a,b,z)}return z},"call$3","nB",6,0,null,91,[],63,[],240,[]],
 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)
@@ -17271,13 +17988,13 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getMilliseconds(),!1)
 else if(a.constructor===DartObject)return a.o
-else return P.ND(a)}},"call$1","Xl",2,0,190,91,[]],
+else return P.ND(a)}},"call$1","Xl",2,0,195,91,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,91,[]],
 iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,91,[],63,[],234,[]],
+P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,91,[],63,[],240,[]],
 E4:{
 "^":"a;eh",
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
@@ -17297,7 +18014,7 @@
 V7:[function(a,b){var z,y
 z=this.eh
 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,77,217,[],265,[]],
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gwK",2,2,null,77,224,[],268,[]],
 $isE4:true,
 static:{uw:function(a,b){var z,y,x
 z=P.wY(a)
@@ -17307,9 +18024,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,233,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,239,[]]}},
 Gn:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -17347,13 +18064,13 @@
 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,23,[]],
-FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,114,[]],
 xe:[function(a,b,c){var z
 if(b>=0){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
 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,47,[],124,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,47,[],129,[]],
 KI:[function(a,b){this.fz(0,b)
 return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,47,[]],
 YW:[function(a,b,c,d,e){var z,y,x
@@ -17371,8 +18088,8 @@
 z.$builtinTypeInfo=[null]
 if(e<0)H.vh(P.N(e))
 C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
-GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,77,128,[]]},
+this.V7("splice",x)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,77,133,[]]},
 Wk:{
 "^":"E4+lD;",
 $isList:true,
@@ -17381,25 +18098,25 @@
 $iscX:true,
 $ascX:null},
 DV:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new DartObject(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -17412,7 +18129,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","yT",4,0,null,123,[],183,[]],
+return a}return a},"call$2","yT",4,0,null,128,[],188,[]],
 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
@@ -17420,7 +18137,7 @@
 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","Yr",4,0,null,123,[],183,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,128,[],188,[]]}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
@@ -17477,8 +18194,8 @@
 $isRY:true,
 $isNL:true,
 $isej:true},
-WS4:{
-"^":"a;ew,yz,nV,V3"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+Lw:{
+"^":"a;ew,yz,nV,Li"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","A9",0,0,null],
 Gj:{
@@ -17501,7 +18218,7 @@
 V1:[function(a){this.EV.V1(0)},"call$0","gyP",0,0,null],
 x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,42,[]],
 di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
@@ -17523,24 +18240,24 @@
 gbx:function(a){return C.PT},
 $isWZ:true,
 "%":"ArrayBuffer"},
-rn:{
+pF:{
 "^":"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,47,[],327,[]],
-XL:[function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.J2(a,b,c)},"call$2","gDR",4,0,null,47,[],327,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,47,[],330,[]],
+XL:[function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.J2(a,b,c)},"call$2","gDR",4,0,null,47,[],330,[]],
 PZ:[function(a,b,c,d){var z=d+1
 this.XL(a,b,z)
 if(c==null)return d
 this.XL(a,c,z)
 if(typeof c!=="number")return H.s(c)
 if(b>c)throw H.b(P.TE(b,0,c))
-return c},"call$3","gyD",6,0,null,115,[],116,[],327,[]],
-$isrn:true,
+return c},"call$3","gyD",6,0,null,120,[],121,[],330,[]],
+$ispF:true,
 $isHY:true,
 "%":";ArrayBufferView;LZ|Ob|Ip|Dg|Nb|nA|Pg"},
 df:{
-"^":"rn;",
+"^":"pF;",
 gbx:function(a){return C.T1},
 $isHY:true,
 "%":"DataView"},
@@ -17553,7 +18270,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.GW]},
 $isyN:true,
@@ -17570,7 +18287,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.GW]},
 $isyN:true,
@@ -17587,7 +18304,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17604,7 +18321,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17621,7 +18338,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17638,7 +18355,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17655,7 +18372,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17673,7 +18390,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17691,7 +18408,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17700,7 +18417,7 @@
 $isHY:true,
 "%":";Uint8Array"},
 LZ:{
-"^":"rn;",
+"^":"pF;",
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
 z=a.length+1
@@ -17713,13 +18430,13 @@
 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,115,[],116,[],27,[],117,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,120,[],121,[],27,[],122,[]],
 $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,115,[],116,[],109,[],117,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isDg:true,
 $isList:true,
 $asWO:function(){return[J.GW]},
@@ -17739,7 +18456,7 @@
 "^":"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,115,[],116,[],109,[],117,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isPg:true,
 $isList:true,
 $asWO:function(){return[J.im]},
@@ -17760,12 +18477,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","XU",2,0,null,26,[]]}],["disassembly_entry_element","package:observatory/src/observatory_elements/disassembly_entry.dart",,E,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,26,[]]}],["disassembly_entry_element","package:observatory/src/elements/disassembly_entry.dart",,E,{
 "^":"",
 Fv:{
-"^":["tuj;F8%-465,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gNI:[function(a){return a.F8},null,null,1,0,466,"instruction",353,354],
-sNI:[function(a,b){a.F8=this.ct(a,C.i6,a.F8,b)},null,null,3,0,467,23,[],"instruction",353],
+"^":["pv;m0%-513,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gkX:[function(a){return a.m0},null,null,1,0,514,"instruction",355,397],
+skX:[function(a,b){a.m0=this.ct(a,C.i6,a.m0,b)},null,null,3,0,515,23,[],"instruction",355],
 "@":function(){return[C.Vy]},
 static:{AH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17778,16 +18495,16 @@
 a.X0=w
 C.er.ZL(a)
 C.er.G6(a)
-return a},null,null,0,0,108,"new DisassemblyEntryElement$created"]}},
-"+DisassemblyEntryElement":[468],
-tuj:{
+return a},null,null,0,0,113,"new DisassemblyEntryElement$created"]}},
+"+DisassemblyEntryElement":[516],
+pv:{
 "^":"uL+Pi;",
-$isd3:true}}],["error_view_element","package:observatory/src/observatory_elements/error_view.dart",,F,{
+$isd3:true}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["Vct;Py%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gkc:[function(a){return a.Py},null,null,1,0,352,"error",353,354],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,355,23,[],"error",353],
+"^":["Vfx;Py%-410,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gkc:[function(a){return a.Py},null,null,1,0,354,"error",355,397],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,357,23,[],"error",355],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17800,14 +18517,14 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.G6(a)
-return a},null,null,0,0,108,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[469],
-Vct:{
+return a},null,null,0,0,113,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[517],
+Vfx:{
 "^":"uL+Pi;",
-$isd3:true}}],["field_ref_element","package:observatory/src/observatory_elements/field_ref.dart",,D,{
+$isd3:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.E6]},
 static:{Tt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17816,22 +18533,20 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.MC.ZL(a)
 C.MC.G6(a)
-return a},null,null,0,0,108,"new FieldRefElement$created"]}},
-"+FieldRefElement":[362]}],["field_view_element","package:observatory/src/observatory_elements/field_view.dart",,A,{
+return a},null,null,0,0,113,"new FieldRefElement$created"]}},
+"+FieldRefElement":[418]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["D13;vt%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gt0:[function(a){return a.vt},null,null,1,0,352,"field",353,354],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,355,23,[],"field",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.vt,"id"))
-a.hm.gDF().fB(z).ml(new A.e5(a)).OA(new A.Ni()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-"@":function(){return[C.Tq]},
+"^":["Urj;vt%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gt0:[function(a){return a.vt},null,null,1,0,354,"field",355,397],
+st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,357,23,[],"field",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.vt,"id")).ml(new A.e5(a)).OA(new A.Ni()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+"@":function(){return[C.vc]},
 static:{cY:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -17843,50 +18558,48 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.G6(a)
-return a},null,null,0,0,108,"new FieldViewElement$created"]}},
-"+FieldViewElement":[470],
-D13:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new FieldViewElement$created"]}},
+"+FieldViewElement":[518],
+Urj:{
+"^":"PO+Pi;",
 $isd3:true},
 e5:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.svt(z,y.ct(z,C.WQ,y.gvt(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.svt(z,y.ct(z,C.WQ,y.gvt(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+FieldViewElement_refresh_closure":[358],
+"+FieldViewElement_refresh_closure":[415],
 Ni:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+FieldViewElement_refresh_closure":[358]}],["function_ref_element","package:observatory/src/observatory_elements/function_ref.dart",,U,{
+"+FieldViewElement_refresh_closure":[415]}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 AX:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.YQ]},
-static:{v9:[function(a){var z,y,x,w
+static:{wH:[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.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.G6(a)
-return a},null,null,0,0,108,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[362]}],["function_view_element","package:observatory/src/observatory_elements/function_view.dart",,N,{
+return a},null,null,0,0,113,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[418]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 yb:{
-"^":["WZq;Z8%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gMj:[function(a){return a.Z8},null,null,1,0,352,"function",353,354],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,355,23,[],"function",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.Z8,"id"))
-a.hm.gDF().fB(z).ml(new N.QR(a)).OA(new N.Yx()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["oub;Z8%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gMj:[function(a){return a.Z8},null,null,1,0,354,"function",355,397],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,357,23,[],"function",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.Z8,"id")).ml(new N.QR(a)).OA(new N.Yx()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17897,58 +18610,58 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.Yu.ZL(a)
-C.Yu.G6(a)
-return a},null,null,0,0,108,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[471],
-WZq:{
-"^":"uL+Pi;",
+C.h4.ZL(a)
+C.h4.G6(a)
+return a},null,null,0,0,113,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[519],
+oub:{
+"^":"PO+Pi;",
 $isd3:true},
 QR:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sZ8(z,y.ct(z,C.nf,y.gZ8(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sZ8(z,y.ct(z,C.nf,y.gZ8(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+FunctionViewElement_refresh_closure":[358],
+"+FunctionViewElement_refresh_closure":[415],
 Yx:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+FunctionViewElement_refresh_closure":[358]}],["heap_profile_element","package:observatory/src/observatory_elements/heap_profile.dart",,K,{
+"+FunctionViewElement_refresh_closure":[415]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 NM:{
-"^":["pva;GQ%-77,J0%-77,Oc%-77,CO%-77,bV%-77,vR%-77,LY%-77,q3%-77,Ol%-349,X3%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gB1:[function(a){return a.Ol},null,null,1,0,352,"profile",353,354],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,355,23,[],"profile",353],
+"^":["c4r;GQ%-77,J0%-77,Oc%-77,CO%-77,bV%-77,kg%-77,LY%-77,q3%-77,Ol%-410,X3%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gB1:[function(a){return a.Ol},null,null,1,0,354,"profile",355,397],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,357,23,[],"profile",355],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
-y=new L.qu(null,P.L5(null,null,null,null,null))
-y.YZ=P.uw(J.UQ($.NR,"Table"),[z])
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.vR=P.uw(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 L.qu(null,P.L5(null,null,null,null,null))
-z.YZ=P.uw(J.UQ($.NR,"PieChart"),[y])
+z=new G.qu(null,P.L5(null,null,null,null,null))
+z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
 a.J0=z
 z.bG.u(0,"title","New Space")
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-y=new L.qu(null,P.L5(null,null,null,null,null))
-y.YZ=P.uw(J.UQ($.NR,"PieChart"),[z])
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
 a.CO=y
 y.bG.u(0,"title","Old Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
-z=new L.qu(null,P.L5(null,null,null,null,null))
-z.YZ=P.uw(J.UQ($.NR,"Table"),[y])
-a.vR=z
+z=new G.qu(null,P.L5(null,null,null,null,null))
+z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+a.kg=z
 z.bG.u(0,"allowHtml",!0)
-J.kW(J.wc(a.vR),"sortColumn",1)
-J.kW(J.wc(a.vR),"sortAscending",!1)
-this.uB(a)},"call$0","gQd",0,0,107,"enteredView"],
+J.kW(J.wc(a.kg),"sortColumn",1)
+J.kW(J.wc(a.kg),"sortAscending",!1)
+this.uB(a)},"call$0","gQd",0,0,112,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
 if(z!=null){z=J.UQ(z,"members")
@@ -17961,9 +18674,9 @@
 if(this.K1(a,x))continue
 y=J.U6(x)
 w=J.UQ(y.t(x,"class"),"name")
-v=a.hm.gZ6().kP(J.UQ(y.t(x,"class"),"id"))
+v=a.pC.Mq(J.UQ(y.t(x,"class"),"id"))
 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()
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.Wj(a,x,0))+"</a>",this.Wj(a,x,1),this.Wj(a,x,2),this.Wj(a,x,3),this.Wj(a,x,4),this.Wj(a,x,5),this.Wj(a,x,6)])}a.GQ.lb()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
@@ -17973,21 +18686,21 @@
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
 J.N5(a.Oc,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
-this.uB(a)},"call$0","gYs",0,0,107,"_updateChartData"],
-uB:[function(a){if(a.q3==null||a.vR==null)return
-a.vR.u5()
-a.vR.W2(a.bV)
+this.uB(a)},"call$0","gYs",0,0,112,"_updateChartData"],
+uB:[function(a){if(a.q3==null||a.kg==null)return
+a.kg.u5()
+a.kg.W2(a.bV)
 a.q3.u5()
 a.q3.W2(a.LY)
 a.J0.W2(a.GQ)
-a.CO.W2(a.Oc)},"call$0","goI",0,0,107,"_draw"],
+a.CO.W2(a.Oc)},"call$0","goI",0,0,112,"_draw"],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 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,472,274,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,520,277,[],"_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)
@@ -18000,8 +18713,8 @@
 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","grz",4,0,473,274,[],47,[],"_fullTableColumnValue"],
-VI:[function(a,b,c){var z
+default:}throw H.b(P.hS())},"call$2","gym",4,0,521,277,[],47,[],"_fullTableColumnValue"],
+Wj:[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)
 return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
@@ -18015,39 +18728,31 @@
 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","gaq",4,0,473,274,[],47,[],"_combinedTableColumnValue"],
-RF:[function(a,b){var z,y
-z=a.hm.gZ6().R6()
-if(a.hm.gnI().AQ(z)==null){N.Jx("").To("No isolate found.")
-return}y="/"+z+"/allocationprofile"
-a.hm.gDF().fB(y).ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-ii:[function(a,b,c,d){var z,y
-z=a.hm.gZ6().R6()
-if(a.hm.gnI().AQ(z)==null){N.Jx("").To("No isolate found.")
-return}y="/"+z+"/allocationprofile/reset"
-a.hm.gDF().fB(y).ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,374,18,[],303,[],74,[],"resetAccumulator"],
+default:}throw H.b(P.hS())},"call$2","gPI",4,0,521,277,[],47,[],"_combinedTableColumnValue"],
+RF:[function(a,b){a.pC.oX("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+ii:[function(a,b,c,d){a.pC.oX("/allocationprofile/reset").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,425,18,[],306,[],74,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gBo(a))},"call$1","gaz",2,0,153,227,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gBo(a))},"call$1","gaz",2,0,158,233,[],"profileChanged"],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.p0(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,474,475,[],"formattedAverage",370],
-NC:[function(a,b){var z,y
+return C.CD.yM(J.FW(J.p0(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,522,523,[],"formattedAverage",356],
+uW:[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","gBo",2,0,474,475,[],"formattedCollections",370],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gBo",2,0,522,523,[],"formattedCollections",356],
 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,474,475,[],"formattedTotalCollectionTime",370],
-Dd:[function(a){var z=new L.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,522,523,[],"formattedTotalCollectionTime",356],
+Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
 a.LY.Gl("number","Current (new)")
@@ -18058,15 +18763,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 L.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new L.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
-z=new L.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.bV=z
 z.Gl("string","Class")
 a.bV.Gl("number","Accumulator")
@@ -18074,9 +18779,9 @@
 a.bV.Gl("number","Current")
 a.bV.Gl("number","Allocated Since GC")
 a.bV.Gl("number","Total before GC")
-a.bV.Gl("number","Survivors after GC")},null,null,0,0,108,"created"],
+a.bV.Gl("number","Survivors after GC")},null,null,0,0,113,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-77,bQj<-77,xK<-77,V1g<-77,r1K<-77,d6<-77,pC<-77,DY2<-77",op:[function(a){var z,y,x,w
+static:{"^":"b7<-77,bQj<-77,WY<-77,V1g<-77,r1K<-77,d6<-77,pC<-77,DP<-77",op:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18086,40 +18791,40 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.Vc.ZL(a)
-C.Vc.G6(a)
-C.Vc.Dd(a)
-return a},null,null,0,0,108,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[476],
-pva:{
-"^":"uL+Pi;",
+C.RJ.ZL(a)
+C.RJ.G6(a)
+C.RJ.Dd(a)
+return a},null,null,0,0,113,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[524],
+c4r:{
+"^":"PO+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:355;a-77",
+"^":"Tp:357;a-77",
 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,355,477,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[358],
+"+HeapProfileElement_refresh_closure":[415],
 jm:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,343,18,[],478,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[358],
+"+HeapProfileElement_refresh_closure":[415],
 xj:{
-"^":"Tp:355;a-77",
+"^":"Tp:357;a-77",
 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,355,477,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[358],
+"+HeapProfileElement_resetAccumulator_closure":[415],
 VB:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,343,18,[],478,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[358]}],["html_common","dart:html_common",,P,{
+"+HeapProfileElement_resetAccumulator_closure":[415]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
@@ -18127,7 +18832,7 @@
 new P.wO().call$0()
 return y},"call$1","Lq",2,0,null,23,[]],
 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,147,6,[],235,[]],
+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,152,6,[],241,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18135,7 +18840,7 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:184;b,c",
+"^":"Tp:189;b,c",
 call$1:[function(a){var z,y,x
 z=this.b
 y=z.length
@@ -18145,23 +18850,23 @@
 return y},"call$1",null,2,0,null,23,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:392;d",
+"^":"Tp:372;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,390,[],"call"],
+return z[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:479;e",
+"^":"Tp:525;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,390,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:225;f,UI,bK",
+"^":"Tp:107;f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -18175,7 +18880,7 @@
 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.$isrn)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)
 w=this.UI.call$1(x)
 z.a=w
@@ -18197,11 +18902,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 q1:{
-"^":"Tp:343;a,Gq",
+"^":"Tp:346;a,Gq",
 call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:184;a,b",
+"^":"Tp:189;a,b",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -18211,19 +18916,19 @@
 return y},"call$1",null,2,0,null,23,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:392;c",
+"^":"Tp:372;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,390,[],"call"],
+return z[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:479;d",
+"^":"Tp:525;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,390,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:225;e,f,UI,bK",
+"^":"Tp:107;e,f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -18258,18 +18963,18 @@
 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,77,23,[],460,[]],
+return y},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
 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,110,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gnr",0,2,null,330,331,[]],
+aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gnr",0,2,null,333,334,[]],
 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,110,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
 ev:[function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,110,[]],
-Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,110,[]],
+return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
+Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,115,[]],
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
@@ -18282,40 +18987,40 @@
 y=z.Rz(0,b)
 this.p5(z)
 return y},"call$1","gRI",2,0,null,23,[]],
-FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,114,[]],
 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,[]],
+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,336,337,[]],
 eR:[function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,289,[]],
+return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,292,[]],
 Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,47,[]],
 V1:[function(a){this.OS(new P.uQ())},"call$0","gyP",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,110,[]],
+return y},"call$1","gFd",2,0,null,115,[]],
 $isyN:true,
 $iscX:true,
 $ascX:function(){return[J.O]}},
 GE:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 D7:{
 "^":"ar;F1,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,115,[]],
 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,47,[],23,[]],
@@ -18327,13 +19032,13 @@
 this.UZ(0,b,z)},
 h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,23,[]],
 FV:[function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,109,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
 tg:[function(a,b){var z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$iscv)return!1
 return b.parentNode===this.F1},"call$1","gdj",2,0,null,102,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,77,128,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
-UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,115,[],116,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,77,133,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,120,[],121,[]],
 V1:[function(a){this.h2.NL.textContent=""},"call$0","gyP",0,0,null],
 xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,47,[],23,[]],
 KI:[function(a,b){var z,y
@@ -18349,7 +19054,7 @@
 if(y>=z.length)return H.e(z,y)
 x=z[y]
 if(x==null?b==null:x===b){J.QC(x)
-return!0}}return!1},"call$1","gRI",2,0,null,124,[]],
+return!0}}return!1},"call$1","gRI",2,0,null,129,[]],
 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)
@@ -18357,26 +19062,35 @@
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,289,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:225;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,285,[],"call"],
-$isEH:true}}],["instance_ref_element","package:observatory/src/observatory_elements/instance_ref.dart",,B,{
+"^":"Tp:107;",
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,288,[],"call"],
+$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 goc:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.goc.call(this,a)
-return J.UQ(z,"preview")},null,null,1,0,367,"name"],
-Qx:[function(a){return this.gus(a)},"call$0","gyX",0,0,108,"expander"],
-SF:[function(a,b,c){P.JS("Calling expandEvent")
-if(b===!0)a.hm.gDF().fB(this.gO3(a)).ml(new B.Js(a)).OA(new B.fM()).YM(c)
-else{J.kW(a.tY,"fields",null)
+return J.UQ(z,"preview")},null,null,1,0,370,"name"],
+gJp:[function(a){var z=a.tY
+if(z!=null)if(J.de(J.UQ(z,"type"),"@Null"))if(J.de(J.UQ(a.tY,"id"),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.de(J.UQ(a.tY,"id"),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.de(J.UQ(a.tY,"id"),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.de(J.UQ(a.tY,"id"),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.de(J.UQ(a.tY,"id"),"objects/being-initialized"))return"This object is currently being initialized."
+return""},null,null,1,0,370,"hoverText"],
+Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,113,"expander"],
+SF:[function(a,b,c){var z,y
+P.JS("Calling expandEvent")
+if(b===!0){z=a.pC
+y=a.tY
+z.oX(y==null?"":J.UQ(y,"id")).ml(new B.Js(a)).OA(new B.fM()).YM(c)}else{J.kW(a.tY,"fields",null)
 J.kW(a.tY,"elements",null)
-c.call$0()}},"call$2","gus",4,0,480,481,[],356,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,526,527,[],413,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18385,37 +19099,39 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.cp.ZL(a)
 C.cp.G6(a)
-return a},null,null,0,0,108,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[362],
+return a},null,null,0,0,113,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[418],
 Js:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y,x
-P.JS("Result is : "+H.d(a))
-z=this.a
-y=J.RE(z)
-x=J.U6(a)
-J.kW(y.gtY(z),"fields",x.t(a,"fields"))
-J.kW(y.gtY(z),"elements",x.t(a,"elements"))
-J.kW(y.gtY(z),"length",x.t(a,"length"))
-P.JS("ref is "+H.d(y.gtY(z)))},"call$1",null,2,0,225,144,[],"call"],
+z=J.U6(a)
+y=this.a
+if(J.de(z.t(a,"type"),"Null")){z.u(a,"type","@Null")
+x=J.RE(y)
+x.stY(y,x.ct(y,C.kY,x.gtY(y),a))}else{x=J.RE(y)
+J.kW(x.gtY(y),"fields",z.t(a,"fields"))
+J.kW(x.gtY(y),"elements",z.t(a,"elements"))
+J.kW(x.gtY(y),"length",z.t(a,"length"))}x=J.RE(y)
+J.kW(x.gtY(y),"fields",z.t(a,"fields"))
+J.kW(x.gtY(y),"elements",z.t(a,"elements"))
+J.kW(x.gtY(y),"length",z.t(a,"length"))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+InstanceRefElement_expandEvent_closure":[358],
+"+InstanceRefElement_expandEvent_closure":[415],
 fM:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while expanding instance-ref: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while expanding instance-ref: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+InstanceRefElement_expandEvent_closure":[358]}],["instance_view_element","package:observatory/src/observatory_elements/instance_view.dart",,Z,{
+"+InstanceRefElement_expandEvent_closure":[415]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["cda;Xh%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gQr:[function(a){return a.Xh},null,null,1,0,352,"instance",353,354],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,355,23,[],"instance",353],
+"^":["Squ;Xh%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gQr:[function(a){return a.Xh},null,null,1,0,354,"instance",355,397],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,357,23,[],"instance",355],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18428,18 +19144,40 @@
 a.X0=w
 C.yK.ZL(a)
 C.yK.G6(a)
-return a},null,null,0,0,108,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[482],
-cda:{
+return a},null,null,0,0,113,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[528],
+Squ:{
+"^":"PO+Pi;",
+$isd3:true}}],["isolate_element","package:observatory/src/elements/isolate_element.dart",,S,{
+"^":"",
+PO:{
+"^":["Vf;pC%-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gAq:[function(a){return a.pC},null,null,1,0,358,"isolate",355,397],
+sAq:[function(a,b){a.pC=this.ct(a,C.Z8,a.pC,b)},null,null,3,0,359,23,[],"isolate",355],
+"@":function(){return[C.EA]},
+static:{O5:[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.wx.ZL(a)
+C.wx.G6(a)
+return a},null,null,0,0,113,"new IsolateElement$created"]}},
+"+IsolateElement":[529],
+Vf:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_list_element","package:observatory/src/observatory_elements/isolate_list.dart",,L,{
+$isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["uL;hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["Zt;Jh-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 RF:[function(a,b){var z=[]
-J.kH(a.hm.gnI().gi2(),new L.fW(z))
-P.pH(z,!1).ml(new L.Ey(b))},"call$1","gvC",2,0,153,356,[],"refresh"],
-"@":function(){return[C.jFV]},
+J.kH(a.Jh.gi2(),new L.fW(z))
+P.pH(z,!1).ml(new L.Ey(b))},"call$1","gvC",2,0,158,413,[],"refresh"],
+"@":function(){return[C.jF]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18451,21 +19189,21 @@
 a.X0=w
 C.b9.ZL(a)
 C.b9.G6(a)
-return a},null,null,0,0,108,"new IsolateListElement$created"]}},
-"+IsolateListElement":[483],
+return a},null,null,0,0,113,"new IsolateListElement$created"]}},
+"+IsolateListElement":[530],
 fW:{
-"^":"Tp:343;a-77",
-call$2:[function(a,b){J.bi(this.a,J.KM(b))},"call$2",null,4,0,343,238,[],14,[],"call"],
+"^":"Tp:346;a-77",
+call$2:[function(a,b){J.bi(this.a,J.KM(b))},"call$2",null,4,0,346,110,[],14,[],"call"],
 $isEH:true},
-"+IsolateListElement_refresh_closure":[358],
+"+IsolateListElement_refresh_closure":[415],
 Ey:{
-"^":"Tp:225;b-77",
-call$1:[function(a){return this.b.call$0()},"call$1",null,2,0,225,237,[],"call"],
+"^":"Tp:107;b-77",
+call$1:[function(a){return this.b.call$0()},"call$1",null,2,0,107,108,[],"call"],
 $isEH:true},
-"+IsolateListElement_refresh_closure":[358]}],["isolate_profile_element","package:observatory/src/observatory_elements/isolate_profile.dart",,X,{
+"+IsolateListElement_refresh_closure":[415]}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 qm:{
-"^":["Y2;Aq>,tT>-364,eT,yt-484,wd-485,oH-486,np,AP,fn",null,function(){return[C.mI]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+"^":["Y2;Aq>,tT>-420,eT,yt-386,wd-403,oH-404,z3,AP,fn",null,function(){return[C.mI]},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
 H.bQ(this.tT.gVS(),new X.vO(this))},"call$0","gz7",0,0,null],
 o8:[function(){return},"call$0","gDT",0,0,null],
@@ -18479,74 +19217,80 @@
 if(c==null)v.h(z,"")
 else{u=c.tT
 v.h(z,X.eI(u.dJ(y),u.QQ()))}v.h(z,X.eI(y.gfF(),w.gB1(x).ghV()))},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,123,[],236,[]],Tl:function(a,b,c){var z,y
-z=H.VM([],[L.Y2])
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","uV",4,0,null,128,[],242,[]],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}}},
 vO:{
-"^":"Tp:488;a",
+"^":"Tp:532;a",
 call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.Aq,J.on(a),z))},"call$1",null,2,0,null,487,[],"call"],
+J.bi(z.wd,X.Tl(z.Aq,J.on(a),z))},"call$1",null,2,0,null,531,[],"call"],
 $isEH:true},
 E7:{
-"^":["waa;BA%-484,fb=-489,qY%-489,qO=-77,Hm%-490,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gXc:[function(a){return a.BA},null,null,1,0,491,"methodCountSelected",353,370],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,392,23,[],"methodCountSelected",353],
-gDt:[function(a){return a.qY},null,null,1,0,492,"topExclusiveCodes",353,370],
-sDt:[function(a,b){a.qY=this.ct(a,C.jI,a.qY,b)},null,null,3,0,493,23,[],"topExclusiveCodes",353],
-i4:[function(a){var z,y,x,w
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null)return
-x=[]
-w=R.Jk([])
-C.Nm.FV(x,["Method","Exclusive","Caller","Inclusive"])
-a.Hm=new L.XN(x,w,null,null)
+"^":["KUl;SS%-386,fb=-533,qY%-533,qO=-77,Hm%-534,pD%-410,eH%-387,vk%-387,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gXc:[function(a){return a.SS},null,null,1,0,371,"methodCountSelected",355,356],
+sXc:[function(a,b){a.SS=this.ct(a,C.fQ,a.SS,b)},null,null,3,0,372,23,[],"methodCountSelected",355],
+gDt:[function(a){return a.qY},null,null,1,0,535,"topExclusiveCodes",355,356],
+sDt:[function(a,b){a.qY=this.ct(a,C.jI,a.qY,b)},null,null,3,0,536,23,[],"topExclusiveCodes",355],
+gB1:[function(a){return a.pD},null,null,1,0,354,"profile",355,397],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,357,23,[],"profile",355],
+gLW:[function(a){return a.eH},null,null,1,0,370,"sampleCount",355,356],
+sLW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,25,23,[],"sampleCount",355],
+gUo:[function(a){return a.vk},null,null,1,0,370,"refreshTime",355,356],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,25,23,[],"refreshTime",355],
+pM:[function(a,b){var z,y
+if(a.pD==null)return
+P.JS("profile changed")
+z=J.UQ(a.pD,"samples")
+this.IW(a,a.pC,z,a.pD)
+y=a.pC
 this.oC(a,y)
-this.f9(a,y)},"call$0","gQd",0,0,107,"enteredView"],
-yG:[function(a){},"call$0","gCn",0,0,107,"_startRequest"],
-M8:[function(a){},"call$0","gjt",0,0,107,"_endRequest"],
-wW:[function(a,b){var z,y
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null)return
+this.f9(a,y)},"call$1","gaz",2,0,158,233,[],"profileChanged"],
+i4:[function(a){var z,y
+z=[]
+y=R.Jk([])
+C.Nm.FV(z,["Method","Exclusive","Caller","Inclusive"])
+a.Hm=new G.XN(z,y,null,null)
+y=a.pC
 this.oC(a,y)
-this.f9(a,y)},"call$1","ghj",2,0,225,227,[],"methodCountSelectedChanged"],
-RF:[function(a,b){var z,y,x
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null){N.Jx("").To("No isolate found.")
-return}x="/"+z+"/profile"
-a.hm.gDF().fB(x).ml(new X.SV(a,y)).OA(new X.vH(a)).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-IW:[function(a,b,c,d){J.CJ(b,L.hh(b,d))
+this.f9(a,y)},"call$0","gQd",0,0,112,"enteredView"],
+wW:[function(a,b){var z=a.pC
+this.oC(a,z)
+this.f9(a,z)},"call$1","ghj",2,0,107,233,[],"methodCountSelectedChanged"],
+RF:[function(a,b){a.pC.oX("profile").ml(new X.SV(a)).OA(new X.Mf()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+IW:[function(a,b,c,d){var z=J.AG(c)
+a.eH=this.ct(a,C.XU,a.eH,z)
+z=P.Gi().bu(0)
+a.vk=this.ct(a,C.Dj,a.vk,z)
+J.CJ(b,G.hh(b,d))
 this.oC(a,b)
-this.f9(a,b)},"call$3","gja",6,0,494,14,[],495,[],477,[],"_loadProfileData"],
+this.f9(a,b)},"call$3","gja",6,0,537,14,[],538,[],379,[],"_loadProfileData"],
 yF:[function(a,b){this.oC(a,b)
-this.f9(a,b)},"call$1","gAL",2,0,496,14,[],"_refresh"],
+this.f9(a,b)},"call$1","gAL",2,0,539,14,[],"_refresh"],
 f9:[function(a,b){var z,y
 z=[]
 for(y=J.GP(a.qY);y.G();)z.push(X.Tl(b,y.gl(),null))
 a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$1","gCK",2,0,496,14,[],"_refreshTree"],
+this.ct(a,C.ep,null,a.Hm)},"call$1","gCK",2,0,539,14,[],"_refreshTree"],
 oC:[function(a,b){var z,y
 J.U2(a.qY)
 if(b==null||J.Tv(b)==null)return
-z=J.UQ(a.fb,a.BA)
+z=J.UQ(a.fb,a.SS)
 y=J.Tv(b).T0(z)
-J.bj(a.qY,y)},"call$1","guE",2,0,496,14,[],"_refreshTopMethods"],
-ka:[function(a,b){return"padding-left: "+H.d(J.p0(b.gyt(),16))+"px;"},"call$1","gGX",2,0,497,498,[],"padding",370],
-LZ:[function(a,b){var z=J.bY(b.gyt(),5)
+J.bj(a.qY,y)},"call$1","guE",2,0,539,14,[],"_refreshTopMethods"],
+ka:[function(a,b){return"padding-left: "+H.d(J.p0(b.gyt(),16))+"px;"},"call$1","gGX",2,0,540,363,[],"padding",356],
+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,497,498,[],"coloring",370],
+return C.PQ[z]},"call$1","gth",2,0,540,363,[],"coloring",356],
 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
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,499,18,[],303,[],74,[],"toggleExpanded",370],
+y.Mf(x-1)}},"call$3","gpR",6,0,541,18,[],306,[],74,[],"toggleExpanded",356],
 "@":function(){return[C.jR]},
 static:{jD:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -18555,43 +19299,40 @@
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.BA=0
+a.SS=0
 a.fb=[10,20,50]
 a.qY=z
 a.qO="#tableTree"
+a.eH=""
+a.vk=""
 a.SO=y
 a.B7=x
 a.X0=v
 C.XH.ZL(a)
 C.XH.G6(a)
-return a},null,null,0,0,108,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[500],
-waa:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[542],
+KUl:{
+"^":"PO+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:355;a-77,b-77",
-call$1:[function(a){var z,y,x,w
+"^":"Tp:357;a-77",
+call$1:[function(a){var z,y,x
 z=J.UQ(a,"samples")
 N.Jx("").To("Profile contains "+H.d(z)+" samples.")
 y=this.a
-x=this.b
-J.CJ(x,L.hh(x,a))
-w=J.RE(y)
-w.oC(y,x)
-w.f9(y,x)},"call$1",null,2,0,355,501,[],"call"],
+x=J.RE(y)
+x.IW(y,x.gpC(y),z,a)},"call$1",null,2,0,357,543,[],"call"],
 $isEH:true},
-"+IsolateProfileElement_refresh_closure":[358],
-vH:{
-"^":"Tp:225;c-77",
-call$1:[function(a){},"call$1",null,2,0,225,18,[],"call"],
+"+IsolateProfileElement_refresh_closure":[415],
+Mf:{
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").wF("Error refreshing profile",a,b)},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+IsolateProfileElement_refresh_closure":[358]}],["isolate_summary_element","package:observatory/src/observatory_elements/isolate_summary.dart",,D,{
+"+IsolateProfileElement_refresh_closure":[415]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
-St:{
-"^":["V0;Pw%-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gAq:[function(a){return a.Pw},null,null,1,0,502,"isolate",353,354],
-sAq:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,503,23,[],"isolate",353],
+Kz:{
+"^":["PO;pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18604,39 +19345,36 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.G6(a)
-return a},null,null,0,0,108,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[504],
-V0:{
-"^":"uL+Pi;",
-$isd3:true}}],["json_view_element","package:observatory/src/observatory_elements/json_view.dart",,Z,{
+return a},null,null,0,0,113,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[544]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["V4;eb%-77,kf%-77,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gvL:[function(a){return a.eb},null,null,1,0,108,"json",353,354],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,225,23,[],"json",353],
+"^":["tuj;eb%-77,kf%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gvL:[function(a){return a.eb},null,null,1,0,113,"json",355,397],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,107,23,[],"json",355],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.kf=0},"call$0","gQd",0,0,107,"enteredView"],
-yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,153,227,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,367,"primitiveString"],
+a.kf=0},"call$0","gQd",0,0,112,"enteredView"],
+yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,158,233,[],"jsonChanged"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,370,"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,367,"valueType"],
+return"Primitive"},null,null,1,0,370,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,491,"counter"],
+return z},null,null,1,0,371,"counter"],
 gaK:[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,492,"list"],
+return[]},null,null,1,0,535,"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,492,"keys"],
+return[]},null,null,1,0,535,"keys"],
 r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,25,42,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
@@ -18652,14 +19390,14 @@
 a.X0=w
 C.GB.ZL(a)
 C.GB.G6(a)
-return a},null,null,0,0,108,"new JsonViewElement$created"]}},
-"+JsonViewElement":[505],
-V4:{
+return a},null,null,0,0,113,"new JsonViewElement$created"]}},
+"+JsonViewElement":[545],
+tuj:{
 "^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/observatory_elements/library_ref.dart",,R,{
+$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.QU]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18668,21 +19406,19 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.G6(a)
-return a},null,null,0,0,108,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[362]}],["library_view_element","package:observatory/src/observatory_elements/library_view.dart",,M,{
+return a},null,null,0,0,113,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[418]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 T2:{
-"^":["V10;N7%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.N7},null,null,1,0,352,"library",353,354],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,355,23,[],"library",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.N7,"id"))
-a.hm.gDF().fB(z).ml(new M.Jq(a)).OA(new M.RJ()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["mHk;N7%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtD:[function(a){return a.N7},null,null,1,0,354,"library",355,397],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,357,23,[],"library",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.N7,"id")).ml(new M.Jq(a)).OA(new M.Yn()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.Gg]},
 static:{SP:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
@@ -18698,24 +19434,24 @@
 a.X0=v
 C.MG.ZL(a)
 C.MG.G6(a)
-return a},null,null,0,0,108,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[506],
-V10:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[546],
+mHk:{
+"^":"PO+Pi;",
 $isd3:true},
 Jq:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sN7(z,y.ct(z,C.EV,y.gN7(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sN7(z,y.ct(z,C.EV,y.gN7(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+LibraryViewElement_refresh_closure":[358],
-RJ:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing library-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"+LibraryViewElement_refresh_closure":[415],
+Yn:{
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing library-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+LibraryViewElement_refresh_closure":[358]}],["logging","package:logging/logging.dart",,N,{
+"+LibraryViewElement_refresh_closure":[415]}],["logging","package:logging/logging.dart",,N,{
 "^":"",
 TJ:{
 "^":"a;oc>,eT>,n2,Cj>,wd>,Gs",
@@ -18735,19 +19471,18 @@
 Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,23,[]],
 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)
-y.EK()
+y=P.Gi()
 x=$.xO
 $.xO=x+1
 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,77,77,507,[],20,[],155,[],156,[]],
-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,77,77,20,[],155,[],156,[]],
-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,"gjW",2,4,null,77,77,20,[],155,[],156,[]],
-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,77,77,20,[],155,[],156,[]],
-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,77,77,20,[],155,[],156,[]],
-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,"gxx",2,4,null,77,77,20,[],155,[],156,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,77,77,547,[],20,[],160,[],161,[]],
+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,"gEX",2,4,null,77,77,20,[],160,[],161,[]],
+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,77,77,20,[],160,[],161,[]],
+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,77,77,20,[],160,[],161,[]],
+wF:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.wF(a,null,null)},"j2","call$3",null,"goa",2,4,null,77,77,20,[],160,[],161,[]],
+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,"gxx",2,4,null,77,77,20,[],160,[],161,[]],
 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
@@ -18760,7 +19495,7 @@
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(new P.AT("name shouldn't start with a '.'"))
@@ -18810,30 +19545,29 @@
 var z=H.VM(new P.Zf(P.Dt(null)),[null])
 N.Jx("").To("Loading Google Charts API")
 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(L.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
+z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:509;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,508,[],"call"],
+"^":"Tp:549;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,548,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"call$1",null,2,0,null,237,[],"call"],
-$isEH:true}}],["message_viewer_element","package:observatory/src/observatory_elements/message_viewer.dart",,L,{
+A.Ok()},"call$1",null,2,0,null,108,[],"call"],
+$isEH:true}}],["message_viewer_element","package:observatory/src/elements/message_viewer.dart",,L,{
 "^":"",
 PF:{
-"^":["uL;Gj%-349,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gG1:[function(a){return a.Gj},null,null,1,0,352,"message",354],
-sG1:[function(a,b){a.Gj=b
-this.ct(a,C.US,"",this.gQW(a))
-this.ct(a,C.zu,[],this.glc(a))
-N.Jx("").To("Viewing message of type '"+H.d(J.UQ(a.Gj,"type"))+"'")},null,null,3,0,355,186,[],"message",354],
+"^":["Vct;Gj%-410,ah%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gG1:[function(a){return a.Gj},null,null,1,0,354,"message",397],
+guw:[function(a){return a.ah},null,null,1,0,408,"app",355,397],
+suw:[function(a,b){a.ah=this.ct(a,C.wh,a.ah,b)},null,null,3,0,551,23,[],"app",355],
+sG1:[function(a,b){if(b==null){N.Jx("").To("Viewing null message.")
+return}N.Jx("").To("Viewing message of type '"+H.d(J.UQ(b,"type"))+"'")
+a.Gj=b
+this.ct(a,C.US,"",this.gQW(a))},null,null,3,0,357,191,[],"message",397],
 gQW:[function(a){var z=a.Gj
 if(z==null||J.UQ(z,"type")==null)return"Error"
-return J.UQ(a.Gj,"type")},null,null,1,0,367,"messageType"],
-glc:[function(a){var z=a.Gj
-if(z==null||J.UQ(z,"members")==null)return[]
-return J.UQ(a.Gj,"members")},null,null,1,0,510,"members"],
+return J.UQ(a.Gj,"type")},null,null,1,0,370,"messageType"],
 "@":function(){return[C.rc]},
 static:{A5:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18846,23 +19580,26 @@
 a.X0=w
 C.Wp.ZL(a)
 C.Wp.G6(a)
-return a},null,null,0,0,108,"new MessageViewerElement$created"]}},
-"+MessageViewerElement":[483]}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
+return a},null,null,0,0,113,"new MessageViewerElement$created"]}},
+"+MessageViewerElement":[552],
+Vct:{
+"^":"uL+Pi;",
+$isd3:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-T4:{
-"^":"a;T9,Jt",
+fA:{
+"^":"a;T9,Bu",
 static:{"^":"Xd,en,pjg,PZ,xa"}},
 Qz:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-PO:{
+Jo:{
 "^":"a;"},
 c5:{
-"^":"a;"}}],["nav_bar_element","package:observatory/src/observatory_elements/nav_bar.dart",,A,{
+"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.nW]},
 static:{z5:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18875,16 +19612,16 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.G6(a)
-return a},null,null,0,0,108,"new NavBarElement$created"]}},
-"+NavBarElement":[483],
+return a},null,null,0,0,113,"new NavBarElement$created"]}},
+"+NavBarElement":[553],
 aQ:{
-"^":["V11;KU%-369,ZC%-369,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.KU},null,null,1,0,367,"link",353,354],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,25,23,[],"link",353],
-gdU:[function(a){return a.ZC},null,null,1,0,367,"anchor",353,354],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["D13;uy%-387,ZC%-387,Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
+sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
+gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
+sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.pc]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18892,7 +19629,7 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
+a.uy="#"
 a.ZC="---"
 a.Jo=!1
 a.SO=z
@@ -18900,17 +19637,17 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.G6(a)
-return a},null,null,0,0,108,"new NavMenuElement$created"]}},
-"+NavMenuElement":[511],
-V11:{
+return a},null,null,0,0,113,"new NavMenuElement$created"]}},
+"+NavMenuElement":[554],
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
-Qa:{
-"^":["V12;KU%-369,ZC%-369,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.KU},null,null,1,0,367,"link",353,354],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,25,23,[],"link",353],
-gdU:[function(a){return a.ZC},null,null,1,0,367,"anchor",353,354],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",353],
+Ya5:{
+"^":["WZq;uy%-387,ZC%-387,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
+sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
+gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
+sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
 "@":function(){return[C.qT]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18918,31 +19655,31 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
+a.uy="#"
 a.ZC="---"
 a.SO=z
 a.B7=y
 a.X0=w
 C.nn.ZL(a)
 C.nn.G6(a)
-return a},null,null,0,0,108,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[512],
-V12:{
+return a},null,null,0,0,113,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[555],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true},
-vI:{
-"^":["V13;rU%-77,SB%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gFR:[function(a){return a.rU},null,null,1,0,108,"callback",353,354],
+Ww:{
+"^":["pva;rU%-77,SB%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gFR:[function(a){return a.rU},null,null,1,0,113,"callback",355,397],
 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,225,23,[],"callback",353],
-gxw:[function(a){return a.SB},null,null,1,0,371,"active",353,354],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,372,23,[],"active",353],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,107,23,[],"callback",355],
+gxw:[function(a){return a.SB},null,null,1,0,380,"active",355,397],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,381,23,[],"active",355],
 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","gzY",6,0,374,18,[],303,[],74,[],"buttonClick"],
-wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,107,"refreshDone"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gzY",6,0,425,18,[],306,[],74,[],"buttonClick"],
+wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,112,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{ZC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18956,15 +19693,15 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.G6(a)
-return a},null,null,0,0,108,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[513],
-V13:{
+return a},null,null,0,0,113,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[556],
+pva:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V14;Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["cda;Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18978,17 +19715,15 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.G6(a)
-return a},null,null,0,0,108,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[514],
-V14:{
+return a},null,null,0,0,113,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[557],
+cda:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["V15;iy%-361,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gAq:[function(a){return a.iy},null,null,1,0,502,"isolate",353,354],
-sAq:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,503,23,[],"isolate",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["qFb;Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.zaS]},
 static:{Yt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19002,17 +19737,17 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.G6(a)
-return a},null,null,0,0,108,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[515],
-V15:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[558],
+qFb:{
+"^":"PO+Pi;",
 $isd3:true},
-Zt:{
-"^":["V16;Ap%-349,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.Ap},null,null,1,0,352,"library",353,354],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,355,23,[],"library",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+oM:{
+"^":["rna;Ap%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtD:[function(a){return a.Ap},null,null,1,0,354,"library",355,397],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,357,23,[],"library",355],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19026,17 +19761,17 @@
 a.X0=w
 C.S3.ZL(a)
 C.S3.G6(a)
-return a},null,null,0,0,108,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[516],
-V16:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[559],
+rna:{
+"^":"PO+Pi;",
 $isd3:true},
 wM:{
-"^":["V17;Au%-349,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.Au},null,null,1,0,352,"cls",353,354],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,355,23,[],"cls",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["Vba;Au%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRu:[function(a){return a.Au},null,null,1,0,354,"cls",355,397],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,357,23,[],"cls",355],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19050,742 +19785,29 @@
 a.X0=w
 C.xE.ZL(a)
 C.xE.G6(a)
-return a},null,null,0,0,108,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[517],
-V17:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory","package:observatory/observatory.dart",,L,{
-"^":"",
-m7:[function(a){var z
-N.Jx("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.cM(),"google"),"visualization")
-$.NR=z
-return z},"call$1","vN",2,0,225,237,[]],
-CX:[function(a){var z,y,x,w,v,u
-z=$.mE().R4(0,a)
-if(z==null)return 0
-try{x=z.gQK().input
-w=z
-v=w.gQK().index
-w=w.gQK()
-if(0>=w.length)return H.e(w,0)
-w=J.q8(w[0])
-if(typeof w!=="number")return H.s(w)
-y=H.BU(C.xB.yn(x,v+w),16,null)
-return y}catch(u){H.Ru(u)
-return 0}},"call$1","Cz",2,0,null,214,[]],
-r5:[function(a){var z,y,x,w,v
-z=$.kj().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-v=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.Nj(x,w,v+y)},"call$1","cK",2,0,null,214,[]],
-Lw:[function(a){var z=L.r5(a)
-if(z==null)return
-return J.ZZ(z,1)},"call$1","J4",2,0,null,214,[]],
-CB:[function(a){var z,y,x,w
-z=$.XJ().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},"call$1","jU",2,0,null,214,[]],
-mL:{
-"^":["Pi;Z6<-518,DF<-519,nI<-520,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
-pO:[function(){var z,y,x
-z=this.Z6
-z.sXT(this)
-y=this.DF
-y.sXT(this)
-x=this.nI
-x.sXT(this)
-$.tE=this
-y.se0(x.gPI())
-z.kI()},"call$0","gGo",0,0,null],
-AQ:[function(a){return J.UQ(this.nI.gi2(),a)},"call$1","grE",2,0,null,238,[]],
-US:function(){this.pO()},
-hq:function(){this.pO()},
-static:{"^":"li,pQ"}},
-Kf:{
-"^":"a;oV<",
-goH:function(){return this.oV.nQ("getNumberOfColumns")},
-gWT:function(a){return this.oV.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.oV.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],521,[]],
-lb:[function(){var z=this.oV
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gGL",0,0,null],
-RP:[function(a,b){var z=[]
-C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.oV.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,498,[]]},
-qu:{
-"^":"a;YZ,bG>",
-u5:[function(){var z,y,x
-z=this.YZ.nQ("getSortInfo")
-if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
-x=J.U6(z)
-y.u(0,"sortColumn",x.t(z,"column"))
-y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gIK",0,0,null],
-W2:[function(a){var z=P.jT(this.bG)
-this.YZ.V7("draw",[a.goV(),z])},"call$1","gW8",2,0,null,181,[]]},
-bv:{
-"^":["Pi;WP,XR<-522,Z0<-523,md,mY,e8,F3,Gg,LE<-524,iP,mU,mM,Td,AP,fn",null,function(){return[C.mI]},function(){return[C.mI]},null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gB1:[function(a){return this.WP},null,null,1,0,525,"profile",353,370],
-sB1:[function(a,b){this.WP=F.Wi(this,C.vb,this.WP,b)},null,null,3,0,526,23,[],"profile",353],
-gjO:[function(a){return this.md},null,null,1,0,367,"id",353,370],
-sjO:[function(a,b){this.md=F.Wi(this,C.EN,this.md,b)},null,null,3,0,25,23,[],"id",353],
-goc:[function(a){return this.mY},null,null,1,0,367,"name",353,370],
-soc:[function(a,b){this.mY=F.Wi(this,C.YS,this.mY,b)},null,null,3,0,25,23,[],"name",353],
-gzz:[function(){return this.e8},null,null,1,0,367,"vmName",353,370],
-szz:[function(a){this.e8=F.Wi(this,C.KS,this.e8,a)},null,null,3,0,25,23,[],"vmName",353],
-gw2:[function(){return this.F3},null,null,1,0,352,"entry",353,370],
-sw2:[function(a){this.F3=F.Wi(this,C.tP,this.F3,a)},null,null,3,0,355,23,[],"entry",353],
-gVc:[function(){return this.Gg},null,null,1,0,367,"rootLib",353,370],
-sVc:[function(a){this.Gg=F.Wi(this,C.iF,this.Gg,a)},null,null,3,0,25,23,[],"rootLib",353],
-gCi:[function(){return this.iP},null,null,1,0,491,"newHeapUsed",353,370],
-sCi:[function(a){this.iP=F.Wi(this,C.IO,this.iP,a)},null,null,3,0,392,23,[],"newHeapUsed",353],
-guq:[function(){return this.mU},null,null,1,0,491,"oldHeapUsed",353,370],
-suq:[function(a){this.mU=F.Wi(this,C.ap,this.mU,a)},null,null,3,0,392,23,[],"oldHeapUsed",353],
-gKu:[function(){return this.mM},null,null,1,0,352,"topFrame",353,370],
-sKu:[function(a){this.mM=F.Wi(this,C.ch,this.mM,a)},null,null,3,0,355,23,[],"topFrame",353],
-gNh:[function(a){return this.Td},null,null,1,0,367,"fileAndLine",353,370],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.Td=F.Wi(this,C.SK,this.Td,b)},null,null,3,0,25,23,[],"fileAndLine",353],
-zr:[function(a){var z="/"+H.d(this.md)+"/"
-return $.tE.DF.fB(z).ml(new L.eS(this)).OA(new L.IQ())},"call$0","gvC",0,0,null],
-eC:[function(a){var z,y,x,w
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"Isolate")){N.Jx("").hh("Unexpected message type in Isolate.update: "+H.d(z.t(a,"type")))
-return}if(z.t(a,"rootLib")==null||z.t(a,"timers")==null||z.t(a,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(a))
-return}y=J.UQ(z.t(a,"rootLib"),"id")
-this.Gg=F.Wi(this,C.iF,this.Gg,y)
-y=z.t(a,"name")
-this.e8=F.Wi(this,C.KS,this.e8,y)
-if(z.t(a,"entry")!=null){y=z.t(a,"entry")
-y=F.Wi(this,C.tP,this.F3,y)
-this.F3=y
-y=J.UQ(y,"name")
-this.mY=F.Wi(this,C.YS,this.mY,y)}else this.mY=F.Wi(this,C.YS,this.mY,"root isolate")
-if(z.t(a,"topFrame")!=null){y=z.t(a,"topFrame")
-this.mM=F.Wi(this,C.ch,this.mM,y)}x=H.B7([],P.L5(null,null,null,null,null))
-J.kH(z.t(a,"timers"),new L.TI(x))
-y=this.LE
-w=J.w1(y)
-w.u(y,"total",x.t(0,"time_total_runtime"))
-w.u(y,"compile",x.t(0,"time_compilation"))
-w.u(y,"gc",0)
-w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
-w.u(y,"dart",x.t(0,"time_dart_execution"))
-y=J.UQ(z.t(a,"heap"),"usedNew")
-this.iP=F.Wi(this,C.IO,this.iP,y)
-z=J.UQ(z.t(a,"heap"),"usedOld")
-this.mU=F.Wi(this,C.ap,this.mU,z)},"call$1","gpn",2,0,null,144,[]],
-bu:[function(a){return H.d(this.md)},"call$0","gXo",0,0,null],
-hv:[function(a){var z,y,x,w
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-if(J.kE(y.t(z,x),a)===!0)return y.t(z,x);++x}return},"call$1","gt7",2,0,null,527,[]],
-R7:[function(){var z,y,x,w
-N.Jx("").To("Reset all code ticks.")
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-y.t(z,x).FB();++x}},"call$0","gve",0,0,null],
-oe:[function(a){var z,y,x,w,v,u,t
-for(z=J.GP(a),y=this.XR,x=J.U6(y);z.G();){w=z.gl()
-v=J.U6(w)
-u=J.UQ(v.t(w,"script"),"id")
-t=x.t(y,u)
-if(t==null){t=L.Ak(v.t(w,"script"))
-x.u(y,u,t)}t.o6(v.t(w,"hits"))}},"call$1","gHY",2,0,null,528,[]],
-$isbv:true,
-static:{"^":"tE?"}},
-eS:{
-"^":"Tp:225;a",
-call$1:[function(a){this.a.eC(a)},"call$1",null,2,0,null,144,[],"call"],
-$isEH:true},
-IQ:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while updating isolate summary: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,null,18,[],359,[],"call"],
-$isEH:true},
-TI:{
-"^":"Tp:225;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,529,[],"call"],
-$isEH:true},
-yU:{
-"^":["Pi;XT?,i2<-530,AP,fn",null,function(){return[C.mI]},null,null],
-Ql:[function(){J.kH(this.XT.DF.gjR(),new L.dY(this))},"call$0","gPI",0,0,107],
-AQ:[function(a){var z,y,x,w,v,u
-z=this.i2
-y=J.U6(z)
-x=y.t(z,a)
-if(x==null){w=P.L5(null,null,null,J.O,L.rj)
-w=R.Jk(w)
-v=H.VM([],[L.kx])
-u=P.L5(null,null,null,J.O,J.GW)
-u=R.Jk(u)
-x=new L.bv(null,w,v,a,"isolate",null,null,null,u,0,0,null,null,null,null)
-y.u(z,a,x)}if(x.gzz()==null)J.KM(x)
-return x},"call$1","grE",2,0,null,238,[]],
-N8:[function(a){var z=[]
-J.kH(this.i2,new L.vY(a,z))
-H.bQ(z,new L.zZ(this))
-J.kH(a,new L.dS(this))},"call$1","gajF",2,0,null,239,[]],
-static:{AC:[function(a,b){return J.pb(b,new L.Ub(a))},"call$2","mc",4,0,null,238,[],239,[]]}},
-Ub:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,531,[],"call"],
-$isEH:true},
-dY:{
-"^":"Tp:225;a",
-call$1:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"IsolateList"))this.a.N8(z.t(a,"members"))},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-vY:{
-"^":"Tp:343;a,b",
-call$2:[function(a,b){if(L.AC(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,427,[],274,[],"call"],
-$isEH:true},
-zZ:{
-"^":"Tp:225;c",
-call$1:[function(a){J.V1(this.c.i2,a)},"call$1",null,2,0,null,238,[],"call"],
-$isEH:true},
-dS:{
-"^":"Tp:225;d",
-call$1:[function(a){var z,y,x,w,v,u,t,s
-z=J.U6(a)
-y=z.t(a,"id")
-x=this.d.i2
-w=J.U6(x)
-v=w.t(x,y)
-if(v==null){u=P.L5(null,null,null,J.O,L.rj)
-u=R.Jk(u)
-t=H.VM([],[L.kx])
-s=P.L5(null,null,null,J.O,J.GW)
-s=R.Jk(s)
-v=new L.bv(null,u,t,z.t(a,"id"),z.t(a,"name"),null,null,null,s,0,0,null,null,null,null)
-w.u(x,y,v)}J.KM(v)},"call$1",null,2,0,null,144,[],"call"],
-$isEH:true},
-dZ:{
-"^":"Pi;XT?,WP,kg,UL,AP,fn",
-gB1:[function(a){return this.WP},null,null,1,0,371,"profile",353,370],
-sB1:[function(a,b){this.WP=F.Wi(this,C.vb,this.WP,b)},null,null,3,0,372,23,[],"profile",353],
-gb8:[function(){return this.kg},null,null,1,0,367,"currentHash",353,370],
-sb8:[function(a){this.kg=F.Wi(this,C.h1,this.kg,a)},null,null,3,0,25,23,[],"currentHash",353],
-gXX:[function(){return this.UL},null,null,1,0,532,"currentHashUri",353,370],
-sXX:[function(a){this.UL=F.Wi(this,C.tv,this.UL,a)},null,null,3,0,533,23,[],"currentHashUri",353],
-kI:[function(){var z=C.PP.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new L.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
-if(!this.S7())this.df()},"call$0","gMz",0,0,null],
-vI:[function(){var z,y,x,w,v
-z=$.oy().R4(0,this.kg)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-v=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.Nj(x,w,v+y)},"call$0","gzJ",0,0,null],
-gwB:[function(){return this.vI()!=null},null,null,1,0,371,"hasCurrentIsolate",370],
-R6:[function(){var z=this.vI()
-if(z==null)return""
-return J.ZZ(z,2)},"call$0","gKo",0,0,null],
-Pr:[function(){var z=this.R6()
-if(z==="")return
-return this.XT.nI.AQ(z)},"call$0","gjf",0,0,502,"currentIsolate",370],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
-z=F.Wi(this,C.h1,this.kg,z)
-this.kg=z
-if(J.de(z,"")||J.de(this.kg,"#")){J.We(C.ol.gmW(window),"#/isolates/")
-return!0}return!1},"call$0","goO",0,0,null],
-df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
-z=F.Wi(this,C.h1,this.kg,z)
-this.kg=z
-y=J.ZZ(z,1)
-z=P.r6($.qG().ej(y))
-this.UL=F.Wi(this,C.tv,this.UL,z)
-z=$.wf()
-x=this.kg
-z=z.Ej
-if(typeof x!=="string")H.vh(new P.AT(x))
-if(z.test(x))this.WP=F.Wi(this,C.vb,this.WP,!0)
-else{this.XT.DF.ox(y)
-this.WP=F.Wi(this,C.vb,this.WP,!1)}},"call$0","glq",0,0,null],
-kP:[function(a){var z=this.R6()
-return"#/"+z+"/"+H.d(a)},"call$1","gVM",2,0,534,276,[],"currentIsolateRelativeLink",370],
-XY:[function(a){return this.kP("scripts/"+P.jW(C.yD,a,C.xM,!1))},"call$1","gOs",2,0,534,535,[],"currentIsolateScriptLink",370],
-r4:[function(a,b,c){return"#/"+H.d(b)+"/"+H.d(c)},"call$2","gLc",4,0,536,537,[],276,[],"relativeLink",370],
-da:[function(a){return"#/"+H.d(a)},"call$1","geP",2,0,534,276,[],"absoluteLink",370],
-static:{"^":"x4,K3D,qY,HT"}},
-Qe:{
-"^":"Tp:225;a",
-call$1:[function(a){var z=this.a
-if(z.S7())return
-F.Wi(z,C.D2,z.vI()==null,z.vI()!=null)
-z.df()},"call$1",null,2,0,null,410,[],"call"],
-$isEH:true},
-DP:{
-"^":["Pi;Yu<-484,m7<-369,L4<-369,Fv,ZZ,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-ga0:[function(){return this.Fv},null,null,1,0,491,"ticks",353,370],
-sa0:[function(a){this.Fv=F.Wi(this,C.p1,this.Fv,a)},null,null,3,0,392,23,[],"ticks",353],
-gGK:[function(){return this.ZZ},null,null,1,0,538,"percent",353,370],
-sGK:[function(a){this.ZZ=F.Wi(this,C.tI,this.ZZ,a)},null,null,3,0,539,23,[],"percent",353],
-oS:[function(){var z=this.ZZ
-if(z==null||J.Hb(z,0))return""
-return J.Ez(this.ZZ,2)+"% ("+H.d(this.Fv)+")"},"call$0","gu3",0,0,367,"formattedTicks",370],
-xt:[function(){return"0x"+J.u1(this.Yu,16)},"call$0","gZd",0,0,367,"formattedAddress",370]},
-WAE:{
-"^":"a;eg",
-bu:[function(a){return"CodeKind."+this.eg},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg",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
-throw H.b(P.hS())},"call$1","J6",2,0,null,86,[]]}},
-N8:{
-"^":"a;Yu<,z4,Iw"},
-Vi:{
-"^":"a;tT>,Ou<"},
-kx:{
-"^":["Pi;fY>,vg,Mb,a0<,VS<,hw,fF<,Du<,va<-540,Qo,uP,mY,B0,AP,fn",null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gkx:[function(){return this.Qo},null,null,1,0,352,"functionRef",353,370],
-skx:[function(a){this.Qo=F.Wi(this,C.yg,this.Qo,a)},null,null,3,0,355,23,[],"functionRef",353],
-gZN:[function(){return this.uP},null,null,1,0,352,"codeRef",353,370],
-sZN:[function(a){this.uP=F.Wi(this,C.EX,this.uP,a)},null,null,3,0,355,23,[],"codeRef",353],
-goc:[function(a){return this.mY},null,null,1,0,367,"name",353,370],
-soc:[function(a,b){this.mY=F.Wi(this,C.YS,this.mY,b)},null,null,3,0,25,23,[],"name",353],
-giK:[function(){return this.B0},null,null,1,0,367,"userName",353,370],
-siK:[function(a){this.B0=F.Wi(this,C.ct,this.B0,a)},null,null,3,0,25,23,[],"userName",353],
-Ne:[function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-this.fF=H.BU(z.t(b,"inclusive_ticks"),null,null)
-this.Du=H.BU(z.t(b,"exclusive_ticks"),null,null)
-y=z.t(b,"ticks")
-if(y!=null&&J.z8(J.q8(y),0)){z=J.U6(y)
-x=this.a0
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=H.BU(z.t(y,w),16,null)
-t=H.BU(z.t(y,w+1),null,null)
-x.push(new L.N8(u,H.BU(z.t(y,w+2),null,null),t))
-w+=3}}},"call$1","gK0",2,0,null,144,[]],
-QQ:[function(){return this.fs(this.VS)},"call$0","gyj",0,0,null],
-dJ:[function(a){return this.U8(this.VS,a)},"call$1","gf7",2,0,null,136,[]],
-fs:[function(a){var z,y,x
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]),y=0;z.G();){x=z.lo.gOu()
-if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gJ6",2,0,null,541,[]],
-U8:[function(a,b){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(J.de(J.on(y),b))return y.gOu()}return 0},"call$2","gPz",4,0,null,541,[],136,[]],
-hI:[function(a,b){var z=J.U6(a)
-this.OV(this.VS,z.t(a,"callers"),b)
-this.OV(this.hw,z.t(a,"callees"),b)},"call$2","gL0",4,0,null,136,[],542,[]],
-OV:[function(a,b,c){var z,y,x,w,v
-C.Nm.sB(a,0)
-z=J.U6(b)
-y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
-if(w>>>0!==w||w>=c.length)return H.e(c,w)
-a.push(new L.Vi(c[w],v))
-y+=2}H.ZE(a,0,a.length-1,new L.fx())},"call$3","gI1",6,0,null,541,[],233,[],542,[]],
-FB:[function(){this.fF=0
-this.Du=0
-C.Nm.sB(this.a0,0)
-for(var z=J.GP(this.va);z.G();)z.gl().sa0(0)},"call$0","gNB",0,0,null],
-fo:[function(a){var z,y,x,w,v
-z=this.va
-y=J.w1(z)
-y.V1(z)
-x=J.U6(a)
-w=0
-while(!0){v=x.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(J.de(x.t(a,w),""))break c$0
-y.h(z,new L.DP(H.BU(x.t(a,w),null,null),x.t(a,w+1),x.t(a,w+2),0,null,null,null))}w+=3}},"call$1","gwj",2,0,null,543,[]],
-tg:[function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.Mb)},"call$1","gdj",2,0,null,527,[]],
-NV:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"function")
-y=R.Jk(y)
-this.Qo=F.Wi(this,C.yg,this.Qo,y)
-y=R.Jk(a)
-this.uP=F.Wi(this,C.EX,this.uP,y)
-y=z.t(a,"name")
-this.mY=F.Wi(this,C.YS,this.mY,y)
-y=z.t(a,"user_name")
-this.B0=F.Wi(this,C.ct,this.B0,y)
-if(z.t(a,"disassembly")!=null)this.fo(z.t(a,"disassembly"))},
-$iskx:true},
-fx:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.xH(b.gOu(),a.gOu())},"call$2",null,4,0,null,123,[],183,[],"call"],
-$isEH:true},
-CM:{
-"^":"a;Aq>,jV,hV<",
-U5:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"ProfileCode"))return
-y=this.Aq
-x=y.hv(H.BU(J.UQ(z.t(a,"code"),"start"),16,null))
-if(x==null){w=L.CQ(z.t(a,"kind"))
-v=z.t(a,"code")
-z=J.U6(v)
-u=H.BU(z.t(v,"start"),16,null)
-t=H.BU(z.t(v,"end"),16,null)
-s=z.t(v,"name")
-r=z.t(v,"user_name")
-q=R.Jk([])
-p=H.B7([],P.L5(null,null,null,null,null))
-p=R.Jk(p)
-o=H.B7([],P.L5(null,null,null,null,null))
-o=R.Jk(o)
-x=new L.kx(w,u,t,[],[],[],0,0,q,p,o,s,null,null,null)
-x.uP=F.Wi(x,C.EX,o,v)
-o=z.t(v,"function")
-q=R.Jk(o)
-x.Qo=F.Wi(x,C.yg,x.Qo,q)
-x.B0=F.Wi(x,C.ct,x.B0,r)
-if(z.t(v,"disassembly")!=null){x.fo(z.t(v,"disassembly"))
-z.u(v,"disassembly",null)}J.bi(y.gZ0(),x)}J.eh(x,a)
-this.jV.push(x)},"call$1","gXx",2,0,null,544,[]],
-T0:[function(a){var z,y
-z=this.Aq.gZ0()
-y=J.w1(z)
-y.GT(z,new L.vu())
-if(J.u6(y.gB(z),a)||J.de(a,0))return z
-return y.D6(z,0,a)},"call$1","gy8",2,0,null,122,[]],
-uH:function(a,b){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"codes")
-this.hV=z.t(b,"samples")
-z=J.U6(y)
-N.Jx("").To("Creating profile from "+H.d(this.hV)+" samples and "+H.d(z.gB(y))+" code objects.")
-this.Aq.R7()
-x=this.jV
-C.Nm.sB(x,0)
-z.aN(y,new L.xn(this))
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-if(w>=x.length)return H.e(x,w)
-x[w].hI(z.t(y,w),x);++w}C.Nm.sB(x,0)},
-static:{hh:function(a,b){var z=new L.CM(a,H.VM([],[L.kx]),0)
-z.uH(a,b)
-return z}}},
-xn:{
-"^":"Tp:225;a",
-call$1:[function(a){var z,y,x,w
-try{this.a.U5(a)}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-N.Jx("").xH("Error processing code object. "+H.d(z)+" "+H.d(y),z,y)}},"call$1",null,2,0,null,136,[],"call"],
-$isEH:true},
-vu:{
-"^":"Tp:545;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,123,[],183,[],"call"],
-$isEH:true},
-c2:{
-"^":["Pi;Rd>-484,eB,P2,AP,fn",function(){return[C.mI]},null,null,null,null],
-gu9:[function(){return this.eB},null,null,1,0,491,"hits",353,370],
-su9:[function(a){this.eB=F.Wi(this,C.K7,this.eB,a)},null,null,3,0,392,23,[],"hits",353],
-ga4:[function(a){return this.P2},null,null,1,0,367,"text",353,370],
-sa4:[function(a,b){this.P2=F.Wi(this,C.MB,this.P2,b)},null,null,3,0,25,23,[],"text",353],
-goG:function(){return J.J5(this.eB,0)},
-gVt:function(){return J.z8(this.eB,0)},
-$isc2:true},
-rj:{
-"^":["Pi;W6,xN,ei,Hz,Sw<-546,UK,AP,fn",null,null,null,null,function(){return[C.mI]},null,null,null],
-gfY:[function(a){return this.W6},null,null,1,0,367,"kind",353,370],
-sfY:[function(a,b){this.W6=F.Wi(this,C.fy,this.W6,b)},null,null,3,0,25,23,[],"kind",353],
-gKC:[function(){return this.xN},null,null,1,0,352,"scriptRef",353,370],
-sKC:[function(a){this.xN=F.Wi(this,C.Be,this.xN,a)},null,null,3,0,355,23,[],"scriptRef",353],
-gQT:[function(){return this.ei},null,null,1,0,367,"shortName",353,354],
-sQT:[function(a){this.ei=F.Wi(this,C.Kt,this.ei,a)},null,null,3,0,25,23,[],"shortName",353],
-gBi:[function(){return this.Hz},null,null,1,0,352,"libraryRef",353,370],
-sBi:[function(a){this.Hz=F.Wi(this,C.cg,this.Hz,a)},null,null,3,0,355,23,[],"libraryRef",353],
-giI:function(){return this.UK},
-gHh:[function(){return J.Pr(this.Sw,1)},null,null,1,0,547,"linesForDisplay",370],
-Av:[function(a){var z,y,x,w
-z=this.Sw
-y=J.U6(z)
-x=J.Wx(a)
-if(x.F(a,y.gB(z)))y.sB(z,x.g(a,1))
-w=y.t(z,a)
-if(w==null){w=new L.c2(a,-1,"",null,null)
-y.u(z,a,w)}return w},"call$1","gKN",2,0,null,548,[]],
-lu:[function(a){var z,y,x,w
-if(a==null)return
-N.Jx("").To("Loading source for "+H.d(J.UQ(this.xN,"name")))
-z=J.uH(a,"\n")
-this.UK=z.length===0
-for(y=0;y<z.length;y=x){x=y+1
-w=this.Av(x)
-if(y>=z.length)return H.e(z,y)
-J.c9(w,z[y])}},"call$1","ghH",2,0,null,27,[]],
-o6:[function(a){var z,y,x
-z=J.U6(a)
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-this.Av(z.t(a,y)).su9(z.t(a,y+1))
-y+=2}F.Wi(this,C.C2,"","("+C.CD.yM(this.Nk(),1)+"% covered)")},"call$1","gpc",2,0,null,549,[]],
-Nk:[function(){var z,y,x,w
-for(z=J.GP(this.Sw),y=0,x=0;z.G();){w=z.gl()
-if(w==null)continue
-if(!w.goG())continue;++x
-if(!w.gVt())continue;++y}if(x===0)return 0
-return y/x*100},"call$0","gCx",0,0,538,"coveredPercentage",370],
-nZ:[function(){return"("+C.CD.yM(this.Nk(),1)+"% covered)"},"call$0","gic",0,0,367,"coveredPercentageFormatted",370],
-Ea:function(a){var z,y
-z=J.U6(a)
-y=H.B7(["id",z.t(a,"id"),"name",z.t(a,"name"),"user_name",z.t(a,"user_name")],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-this.xN=F.Wi(this,C.Be,this.xN,y)
-y=J.ZZ(z.t(a,"name"),J.WB(J.eJ(z.t(a,"name"),"/"),1))
-this.ei=F.Wi(this,C.Kt,this.ei,y)
-y=z.t(a,"library")
-y=R.Jk(y)
-this.Hz=F.Wi(this,C.cg,this.Hz,y)
-y=z.t(a,"kind")
-this.W6=F.Wi(this,C.fy,this.W6,y)
-this.lu(z.t(a,"source"))},
-$isrj:true,
-static:{Ak:function(a){var z,y,x
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=H.B7([],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-x=H.VM([],[L.c2])
-x=R.Jk(x)
-x=new L.rj(null,z,null,y,x,!0,null,null)
-x.Ea(a)
-return x}}},
-Nu:{
-"^":"Pi;XT?,e0?",
-pG:function(){return this.e0.call$0()},
-geG:[function(){return this.SI},null,null,1,0,367,"prefix",353,370],
-seG:[function(a){this.SI=F.Wi(this,C.qb3,this.SI,a)},null,null,3,0,25,23,[],"prefix",353],
-gjR:[function(){return this.Tj},null,null,1,0,510,"responses",353,370],
-sjR:[function(a){this.Tj=F.Wi(this,C.wH,this.Tj,a)},null,null,3,0,550,23,[],"responses",353],
-FH:[function(a){var z,y,x,w,v
-z=null
-try{z=C.xr.kV(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-this.AI(H.d(y)+" "+H.d(x))}return z},"call$1","gkJ",2,0,null,477,[]],
-f3:[function(a){var z,y
-z=this.FH(a)
-if(z==null)return
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)this.dq([z])
-else this.dq(z)},"call$1","gI5",2,0,null,551,[]],
-dq:[function(a){var z=R.Jk(a)
-this.Tj=F.Wi(this,C.wH,this.Tj,z)
-if(this.e0!=null)this.pG()},"call$1","gvw",2,0,null,373,[]],
-AI:[function(a){this.dq([H.B7(["type","Error","errorType","ResponseError","text",a],P.L5(null,null,null,null,null))])
-N.Jx("").hh(a)},"call$1","gug",2,0,null,20,[]],
-Uu:[function(a){var z,y,x,w,v
-z=L.Lw(a)
-if(z==null){this.AI(z+" is not an isolate id.")
-return}y=this.XT.nI.AQ(z)
-if(y==null){this.AI(z+" could not be found.")
-return}x=L.CX(a)
-w=J.x(x)
-if(w.n(x,0)){this.AI(a+" is not a valid code request.")
-return}v=y.hv(x)
-if(v!=null){N.Jx("").To("Found code with 0x"+w.WZ(x,16)+" in isolate.")
-this.dq([H.B7(["type","Code","code",v],P.L5(null,null,null,null,null))])
-return}this.ym(0,a).ml(new L.Q4(this,y,x)).OA(this.gSC())},"call$1","gVB",2,0,null,552,[]],
-GY:[function(a){var z,y,x,w,v
-z=L.Lw(a)
-if(z==null){this.AI(z+" is not an isolate id.")
-return}y=this.XT.nI.AQ(z)
-if(y==null){this.AI(z+" could not be found.")
-return}x=L.CB(a)
-if(x==null){this.AI(a+" is not a valid script request.")
-return}w=J.UQ(y.gXR(),x)
-v=w!=null
-if(v&&!w.giI()){N.Jx("").To("Found script "+H.d(J.UQ(w.gKC(),"name"))+" in isolate")
-this.dq([H.B7(["type","Script","script",w],P.L5(null,null,null,null,null))])
-return}if(v){this.fB(a).ml(new L.aJ(this,w))
-return}this.fB(a).ml(new L.u4(this,y,x))},"call$1","gPc",2,0,null,552,[]],
-xl:[function(a,b){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isew){z=W.qc(a.target)
-y=J.RE(z)
-x=H.d(y.gys(z))+" "+y.gpo(z)
-if(y.gys(z)===0)x="No service found. Did you run with --enable-vm-service ?"
-this.dq([H.B7(["type","Error","errorType","RequestError","text",x],P.L5(null,null,null,null,null))])}else this.AI(H.d(a)+" "+H.d(b))},"call$2","gSC",4,0,553,18,[],478,[]],
-ox:[function(a){var z=$.mE().Ej
-if(z.test(a)){this.Uu(a)
-return}z=$.Ww().Ej
-if(z.test(a)){this.GY(a)
-return}this.ym(0,a).ml(new L.pF(this)).OA(this.gSC())},"call$1","gRD",2,0,null,552,[]],
-fB:[function(a){return this.ym(0,C.xB.nC(a,"#")?C.xB.yn(a,1):a).ml(new L.Q2())},"call$1","gHi",2,0,null,552,[]]},
-Q4:{
-"^":"Tp:225;a,b,c",
-call$1:[function(a){var z,y,x,w,v,u,t
-z=this.a
-y=z.FH(a)
-if(y==null)return
-x=R.Jk([])
-w=H.B7([],P.L5(null,null,null,null,null))
-w=R.Jk(w)
-v=H.B7([],P.L5(null,null,null,null,null))
-v=R.Jk(v)
-u=J.U6(y)
-t=new L.kx(C.l8,H.BU(u.t(y,"start"),16,null),H.BU(u.t(y,"end"),16,null),[],[],[],0,0,x,w,v,null,null,null,null)
-t.NV(y)
-N.Jx("").To("Added code with 0x"+J.u1(this.c,16)+" to isolate.")
-J.bi(this.b.gZ0(),t)
-z.dq([H.B7(["type","Code","code",t],P.L5(null,null,null,null,null))])},"call$1",null,2,0,null,551,[],"call"],
-$isEH:true},
-aJ:{
-"^":"Tp:225;a,b",
-call$1:[function(a){var z=this.b
-z.lu(J.UQ(a,"source"))
-N.Jx("").To("Grabbed script "+H.d(J.UQ(z.gKC(),"name"))+" source.")
-this.a.dq([H.B7(["type","Script","script",z],P.L5(null,null,null,null,null))])},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-u4:{
-"^":"Tp:225;c,d,e",
-call$1:[function(a){var z=L.Ak(a)
-N.Jx("").To("Added script "+H.d(J.UQ(z.xN,"name"))+" to isolate.")
-this.c.dq([H.B7(["type","Script","script",z],P.L5(null,null,null,null,null))])
-J.kW(this.d.gXR(),this.e,z)},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-pF:{
-"^":"Tp:225;a",
-call$1:[function(a){this.a.f3(a)},"call$1",null,2,0,null,551,[],"call"],
-$isEH:true},
-Q2:{
-"^":"Tp:225;",
-call$1:[function(a){var z,y,x
-try{z=C.xr.kV(a)
-y=R.Jk(z)
-return y}catch(x){H.Ru(x)}return},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-r1:{
-"^":"Nu;XT,e0,SI,Tj,AP,fn",
-ym:[function(a,b){N.Jx("").To("Requesting "+b)
-return W.It(J.WB(this.SI,b),null,null)},"call$1","gkq",2,0,null,552,[]]},
-Rb:{
-"^":"Nu;eA,Wj,XT,e0,SI,Tj,AP,fn",
-AJ:[function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.UQ(z.gRn(a),"id")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.de(x,"observatoryData"))return
-z=this.eA
-v=z.t(0,y)
-if(v!=null){z.Rz(0,y)
-P.JS("Completing "+H.d(y))
-J.Xf(v,w)}else P.JS("Could not find completer for "+H.d(y))},"call$1","gpJ",2,0,153,19,[]],
-ym:[function(a,b){var z,y,x
-z=""+this.Wj
-y=H.B7([],P.L5(null,null,null,null,null))
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-y.u(0,"query",b)
-this.Wj=this.Wj+1
-x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.eA.u(0,z,x)
-J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gkq",2,0,null,552,[]]},
-Y2:{
-"^":["Pi;eT>,yt<-484,wd>-485,oH<-486",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
-goE:function(a){return this.np},
-soE:function(a,b){var z=this.np
-this.np=b
-if(z!==b)if(b)this.C4(0)
-else this.o8()},
-r8:[function(){this.soE(0,!this.np)
-return this.np},"call$0","gMk",0,0,null],
-$isY2:true},
-XN:{
-"^":["Pi;JL,WT>-485,AP,fn",null,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","gE3",2,0,null,554,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.ad(z)
-else this.cB(z)},"call$1","gMk",2,0,null,555,[]],
-ad:[function(a){var z,y,x,w,v,u,t
-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","ghF",2,0,null,498,[]],
-cB:[function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.q8(z.gwd(a))
-if(J.de(y,0))return
-if(typeof y!=="number")return H.s(y)
-x=0
-for(;x<y;++x)if(J.YV(J.UQ(z.gwd(a),x))===!0)this.cB(J.UQ(z.gwd(a),x))
-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","gjc",2,0,null,498,[]]}}],["observatory_application_element","package:observatory/src/observatory_elements/observatory_application.dart",,V,{
+return a},null,null,0,0,113,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[560],
+Vba:{
+"^":"PO+Pi;",
+$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V18;k5%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gzj:[function(a){return a.k5},null,null,1,0,371,"devtools",353,354],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,372,23,[],"devtools",353],
+"^":["waa;k5%-417,xH%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gzj:[function(a){return a.k5},null,null,1,0,380,"devtools",355,397],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,381,23,[],"devtools",355],
+guw:[function(a){return a.xH},null,null,1,0,408,"app",355,356],
+suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,551,23,[],"app",355],
 ZB:[function(a){var z,y
-if(a.k5===!0){z=P.L5(null,null,null,null,null)
-y=R.Jk([])
-y=new L.Rb(z,0,null,null,"http://127.0.0.1:8181",y,null,null)
-z=C.ph.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gpJ()),z.Sg),[H.Kp(z,0)]).Zz()
-z=P.L5(null,null,null,J.O,L.bv)
-z=R.Jk(z)
-z=new L.mL(new L.dZ(null,!1,"",null,null,null),y,new L.yU(null,z,null,null),null,null)
+if(a.k5===!0){z=new G.ho(P.L5(null,null,null,null,null),0,null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null)
+y=C.ph.aM(window)
+H.VM(new W.Ov(0,y.uv,y.Ph,W.aF(z.gcW()),y.Sg),[H.Kp(y,0)]).Zz()
+P.JS("Connected to DartiumVM")
+z=new G.mL(new G.dZ(null,!1,"",null,null,null),z,null,null,null,null)
 z.hq()
-a.hm=this.ct(a,C.wh,a.hm,z)}else{z=R.Jk([])
-y=P.L5(null,null,null,J.O,L.bv)
-y=R.Jk(y)
-y=new L.mL(new L.dZ(null,!1,"",null,null,null),new L.r1(null,null,"http://127.0.0.1:8181",z,null,null),new L.yU(null,y,null,null),null,null)
-y.US()
-a.hm=this.ct(a,C.wh,a.hm,y)}},null,null,0,0,108,"created"],
-"@":function(){return[C.y2]},
+a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new G.mL(new G.dZ(null,!1,"",null,null,null),new G.XK("http://127.0.0.1:8181/",null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null),null,null,null,null)
+z.US()
+a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,113,"created"],
+"@":function(){return[C.kR]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19799,21 +19821,18 @@
 C.k0.ZL(a)
 C.k0.G6(a)
 C.k0.ZB(a)
-return a},null,null,0,0,108,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[556],
-V18:{
+return a},null,null,0,0,113,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[561],
+waa:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/observatory_elements/observatory_element.dart",,Z,{
+$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["LP;hm%-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,107,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,107,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,557,12,[],227,[],228,[],"attributeChanged"],
-guw:[function(a){return a.hm},null,null,1,0,558,"app",353,354],
-suw:[function(a,b){a.hm=this.ct(a,C.wh,a.hm,b)},null,null,3,0,559,23,[],"app",353],
-Dy:[function(a,b){},"call$1","gpx",2,0,153,227,[],"appChanged"],
-gpQ:[function(a){return!0},null,null,1,0,371,"applyAuthorStyles"],
+"^":["ir;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,112,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,112,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,562,12,[],233,[],234,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,380,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.p0(b,1000))
@@ -19823,28 +19842,28 @@
 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,560,561,[],"formatTime"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,563,564,[],"formatTime"],
 Ze:[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,394,562,[],"formatSize"],
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,444,565,[],"formatSize"],
 bj:[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,563,564,[],"fileAndLine"],
-nt:[function(a,b){return J.de(b,"@Null")},"call$1","gYx",2,0,565,11,[],"isNullRef"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,566,567,[],"fileAndLine"],
+nt:[function(a,b){return J.de(b,"@Null")},"call$1","gYx",2,0,568,11,[],"isNullRef"],
 Qq:[function(a,b){var z=J.x(b)
-return z.n(b,"@Smi")||z.n(b,"@Mint")||z.n(b,"@Bigint")},"call$1","gBI",2,0,565,11,[],"isIntRef"],
-TJ:[function(a,b){return J.de(b,"@Bool")},"call$1","gX4",2,0,565,11,[],"isBoolRef"],
-qH:[function(a,b){return J.de(b,"@String")},"call$1","gwm",2,0,565,11,[],"isStringRef"],
-JG:[function(a,b){return J.de(b,"@Instance")},"call$1","gUq",2,0,565,11,[],"isInstanceRef"],
-CL:[function(a,b){return J.de(b,"@Closure")},"call$1","gj7",2,0,565,11,[],"isClosureRef"],
+return z.n(b,"@Smi")||z.n(b,"@Mint")||z.n(b,"@Bigint")},"call$1","gBI",2,0,568,11,[],"isIntRef"],
+TJ:[function(a,b){return J.de(b,"@Bool")},"call$1","gX4",2,0,568,11,[],"isBoolRef"],
+qH:[function(a,b){return J.de(b,"@String")},"call$1","gwm",2,0,568,11,[],"isStringRef"],
+JG:[function(a,b){return J.de(b,"@Instance")},"call$1","gUq",2,0,568,11,[],"isInstanceRef"],
+CL:[function(a,b){return J.de(b,"@Closure")},"call$1","gj7",2,0,568,11,[],"isClosureRef"],
 Bk:[function(a,b){var z=J.x(b)
-return z.n(b,"@GrowableObjectArray")||z.n(b,"@Array")},"call$1","gmv",2,0,565,11,[],"isListRef"],
-VR:[function(a,b){return!C.Nm.tg(["@Null","@Smi","@Mint","@Biginit","@Bool","@String","@Closure","@Instance","@GrowableObjectArray","@Array"],b)},"call$1","gua",2,0,565,11,[],"isUnexpectedRef"],
+return z.n(b,"@GrowableObjectArray")||z.n(b,"@Array")},"call$1","gmv",2,0,568,11,[],"isListRef"],
+VR:[function(a,b){return!C.Nm.tg(["@Null","@Smi","@Mint","@Biginit","@Bool","@String","@Closure","@Instance","@GrowableObjectArray","@Array"],b)},"call$1","gua",2,0,568,11,[],"isUnexpectedRef"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19857,15 +19876,12 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.G6(a)
-return a},null,null,0,0,108,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
+return a},null,null,0,0,113,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
 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,240,23,[],241,[],"_zeroPad"]}},
-"+ObservatoryElement":[566],
-LP:{
-"^":"ir+Pi;",
-$isd3:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","px",4,0,243,23,[],244,[],"_zeroPad"]}},
+"+ObservatoryElement":[569]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19874,8 +19890,8 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"call$0","gqw",0,0,107],
-ni:[function(a){a.AP=null},"call$0","gl1",0,0,107],
+k0:[function(a){},"call$0","gqw",0,0,112],
+ni:[function(a){a.AP=null},"call$0","gl1",0,0,112],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -19885,20 +19901,20 @@
 if(x&&z!=null){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,371],
+return!0}return!1},"call$0","gDx",0,0,380],
 gUV: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,254,[],227,[],228,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,257,[],233,[],234,[]],
 nq:[function(a,b){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},"call$1","giA",2,0,null,22,[]],
+P.rb(this.gDx(a))}a.fn.push(b)},"call$1","gbW",2,0,null,22,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
@@ -19913,7 +19929,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 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,108,"value",353],
+gP:[function(a){return this.Sv},null,null,1,0,113,"value",355],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19927,14 +19943,14 @@
 x.push(w)}this.Ow()},"call$0","gM",0,0,null],
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"call$1","geu",2,0,153,237,[]],
+P.rb(this.gMc())},"call$1","geu",2,0,158,108,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,107],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,112],
 cO:[function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -19942,11 +19958,11 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},"call$0","gJK",0,0,null],
-k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,108],
-ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,108],
+k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,113],
+ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,113],
 $isJ3:true},
 E5:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
@@ -19964,48 +19980,49 @@
 $.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-s=s.iE!==s
+if(s!=null){r=s.iE
+s=r==null?s!=null:r!==s}else s=!1
 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();){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
+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
 $.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:567;a",
+"^":"Tp:570;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"call$2",null,4,0,null,165,[],146,[],"call"],
+a.RK(b,new O.b5(z))},"call$2",null,4,0,null,170,[],151,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){this.a.a=!1
 O.Y3()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:166;b",
+"^":"Tp:171;b",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,164,[],165,[],146,[],110,[],"call"],
+return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:108;c,d,e,f",
+"^":"Tp:113;c,d,e,f",
 call$0:[function(){this.c.call$2(this.d,this.e)
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:568;UI",
+"^":"Tp:571;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,164,[],165,[],146,[],110,[],"call"],
+return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:225;bK,Gq,Rm,w3",
+"^":"Tp:107;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,21,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
@@ -20045,7 +20062,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,242,[],243,[],244,[],245,[],246,[],247,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -20080,10 +20097,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,248,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,251,[]],
 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,249,[],250,[],251,[]],
+return c},"call$3","UF",6,0,null,252,[],253,[],254,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -20094,7 +20111,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,249,[],250,[],251,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,252,[],253,[],254,[]],
 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)
@@ -20144,7 +20161,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","Lr",12,0,null,242,[],243,[],244,[],245,[],246,[],247,[]],
+return p},"call$6","Lr",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b.gWA()
 y=J.zj(b)
@@ -20183,11 +20200,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,252,[],22,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,255,[],22,[]],
 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,68,[],253,[]],
+return z},"call$2","bN",4,0,null,68,[],256,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -20197,7 +20214,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","SI",4,0,null,68,[],253,[]],
+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,68,[],256,[]],
 DA:{
 "^":"a;WA<,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -20210,7 +20227,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,42,[]],
+return a<z},"call$1","gw9",2,0,null,42,[]],
 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
@@ -20220,19 +20237,79 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-ndx:{
-"^":"a;"},
+nd:{
+"^":"a;",
+$isnd:true},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gUV(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,93,[],254,[],227,[],228,[]],
+return d},"call$4","T7",8,0,null,93,[],257,[],233,[],234,[]],
 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)])},
+gUV: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.x(u)
+if(typeof u!=="object"||u===null||!z.$isRY||u.gV5()||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,112],
+B0:[function(){if(this.V2!=null){this.wv=null
+this.V2=null}},"call$0","gkk",0,0,112],
+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,257,[],233,[],234,[]],
+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","gbW",2,0,null,22,[]],
 $isd3:true},
 lS:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -20242,14 +20319,14 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],227,[],"call"],
+z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],233,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
 "^":"Pi;L1,AP,fn",
-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",353],
+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",355],
 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")},228,[],"value",353],
+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")},234,[],"value",355],
 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:{
@@ -20258,7 +20335,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,491,"length",353],
+gB:[function(a){return this.h3.length},null,null,1,0,371,"length",355],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -20286,10 +20363,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,392,23,[],"length",353],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,372,23,[],"length",355],
 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:"Zg",ret:a,args:[J.im]}},this.$receiver,"wn")},47,[],"[]",353],
+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")},47,[],"[]",355],
 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)
@@ -20301,9 +20378,9 @@
 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")},47,[],23,[],"[]=",353],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,371,"isEmpty",353],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,371,"isNotEmpty",353],
+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")},47,[],23,[],"[]=",355],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,380,"isEmpty",355],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,380,"isNotEmpty",355],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -20322,10 +20399,10 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,109,[]],
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,114,[]],
 Rz:[function(a,b){var z,y
 for(z=this.h3,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},"call$1","gRI",2,0,null,124,[]],
+return!0}return!1},"call$1","gRI",2,0,null,129,[]],
 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))
@@ -20353,7 +20430,7 @@
 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,115,[],116,[]],
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,120,[],121,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
@@ -20369,7 +20446,7 @@
 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,47,[],124,[]],
+z[b]=c},"call$2","gQG",4,0,null,47,[],129,[]],
 KI:[function(a,b){var z,y
 z=this.h3
 if(b<0||b>=z.length)return H.e(z,b)
@@ -20388,7 +20465,7 @@
 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","gdX",4,0,null,227,[],228,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,233,[],234,[]],
 cv:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
@@ -20400,7 +20477,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,371],
+return!0}return!1},"call$0","gL6",0,0,380],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -20408,7 +20485,7 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){this.a.xg=null},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -20422,18 +20499,18 @@
 qC:{
 "^":"Pi;Zp,AP,fn",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"pD",ret:[P.cX,a]}},this.$receiver,"qC")},"keys",353],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"NE",ret:[P.cX,a]}},this.$receiver,"qC")},"keys",355],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"NE",ret:[P.cX,b]}},this.$receiver,"qC")},"values",353],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.cX,b]}},this.$receiver,"qC")},"values",355],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,491,"length",353],
+return z.gB(z)},null,null,1,0,371,"length",355],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,371,"isEmpty",353],
+return z.gB(z)===0},null,null,1,0,380,"isEmpty",355],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,371,"isNotEmpty",353],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,569,23,[],"containsValue",353],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,569,42,[],"containsKey",353],
-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")},42,[],"[]",353],
+return z.gB(z)!==0},null,null,1,0,380,"isNotEmpty",355],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,572,23,[],"containsValue",355],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,572,42,[],"containsKey",355],
+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")},42,[],"[]",355],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -20444,7 +20521,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:"fK",void:true,args:[a,b]}},this.$receiver,"qC")},42,[],23,[],"[]=",353],
+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:"fK",void:true,args:[a,b]}},this.$receiver,"qC")},42,[],23,[],"[]=",355],
 FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,104,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -20463,7 +20540,7 @@
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isZ0:true,
 static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
@@ -20479,7 +20556,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,42,[],23,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
@@ -20562,7 +20639,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,108,"value",353],
+return C.Nm.grZ(this.kN)},null,null,1,0,113,"value",355],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20579,16 +20656,16 @@
 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,456,228,[],"value",353],
+z[y]=b}},null,null,3,0,504,234,[],"value",355],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"call$0","gqw",0,0,107],
+this.XI()},"call$0","gqw",0,0,112],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,107],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,112],
 Zy:[function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -20604,7 +20681,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,77,116,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,77,121,[]],
 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
@@ -20622,7 +20699,7 @@
 t[s]=u}this.ij(a)
 if(this.gUV(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gWx",0,3,null,332,115,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,335,120,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20631,7 +20708,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,77,115,[],116,[]],
+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,335,77,120,[],121,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20655,7 +20732,7 @@
 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","gCf",2,0,null,390,[]],
+v[a]=w}}},"call$1","gCf",2,0,null,441,[]],
 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
@@ -20672,23 +20749,23 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:225;",
-call$1:[function(a){return},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:570;a,b,c",
+"^":"Tp:573;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,253,[],"call"],
+return}},"call$1",null,2,0,null,256,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:571;d,e,f",
+"^":"Tp:574;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,253,[],"call"],
+return}},"call$1",null,2,0,null,256,[],"call"],
 $isEH:true},
-Md:{
-"^":"Tp:108;",
+YJ:{
+"^":"Tp:113;",
 call$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
@@ -20700,10 +20777,10 @@
 return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,225,23,[]],
+return x}return a},"call$1","np",2,0,107,23,[]],
 km:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,427,[],274,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,402,[],277,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -20730,18 +20807,18 @@
 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,255,[],256,[]],
+b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,258,[],259,[]],
 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
 a=a.gAY()}while(!J.de(a,$.Tf()))
-return},"call$2","il",4,0,null,255,[],66,[]],
+return},"call$2","il",4,0,null,258,[],66,[]],
 bc:[function(a,b){var z,y
 z=H.le(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,255,[],257,[]],
+return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,258,[],260,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20750,7 +20827,7 @@
 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,258,[],12,[],259,[]],
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,261,[],12,[],262,[]],
 Hl:[function(a){var z,y,x,w,v,u,t
 if(a==null)return""
 w=J.RE(a)
@@ -20770,28 +20847,28 @@
 if(typeof w==="object"&&w!==null&&!!t.$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,260,[]],
+return""}else throw u}},"call$1","NI",2,0,null,263,[]],
 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,77,12,[],11,[]],
-zM:[function(a){A.Vx(a,new A.Mq())},"call$1","mo",2,0,null,261,[]],
+zM:[function(a){A.Vx(a,new A.Mq())},"call$1","jU",2,0,null,264,[]],
 Vx:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.Vx(z,b)},"call$2","Dv",4,0,null,261,[],151,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.Vx(z,b)},"call$2","Dv",4,0,null,264,[],156,[]],
 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,262,[],12,[],261,[],263,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,265,[],12,[],264,[],266,[]],
 Hr:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","Fd",2,0,null,261,[]],
+return $.od().t(0,a)},"call$1","Fd",2,0,null,264,[]],
 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,41,[],264,[],265,[]],
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,41,[],267,[],268,[]],
 Rk:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
@@ -20803,7 +20880,7 @@
 z.textContent=a.textContent
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,266,[],267,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,269,[],270,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
@@ -20821,7 +20898,7 @@
 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,23,[]],
+return},"call$1","v9",2,0,null,23,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20830,7 +20907,7 @@
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.Bl())},"call$0","PB",0,0,107],
+$.ax().ml(new A.Bl())},"call$0","PB",0,0,112],
 Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
@@ -20860,7 +20937,7 @@
 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,77,77,268,[],269,[],270,[],271,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,77,77,271,[],272,[],273,[],274,[]],
 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
@@ -20918,7 +20995,7 @@
 p=k.gYj()
 $.Ej().u(0,q,p)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,272,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,275,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.za){y=!0
 break}if(!y)return
@@ -20932,10 +21009,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.call$1(x)
-return}a.CI(b.gIf(),C.xD)},"call$2","K0n",4,0,null,93,[],217,[]],
+return}a.CI(b.gIf(),C.xD)},"call$2","K0n",4,0,null,93,[],224,[]],
 Zj:{
-"^":"Tp:225;",
-call$1:[function(a){A.pX()},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){A.pX()},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,Ei",
@@ -20983,7 +21060,7 @@
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
 return!0},"call$1","gLD",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,259,[]],
+return!0}return!1},"call$1","gmL",2,0,null,262,[]],
 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")
@@ -21011,14 +21088,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,255,[],572,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,258,[],575,[]],
 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,573,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,576,[]],
 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],
@@ -21044,7 +21121,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,77,462,[],574,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,77,510,[],577,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -21055,14 +21132,14 @@
 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,575,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,578,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 z.textContent=b
 z.toString
 z.setAttribute("element",a.RT+"-"+c)
-return z},"call$2","gNG",4,0,null,576,[],575,[]],
+return z},"call$2","gNG",4,0,null,579,[],578,[]],
 q1:[function(a,b){var z,y,x,w
 if(J.de(b,$.Tf()))return
 this.q1(a,b.gAY())
@@ -21073,10 +21150,10 @@
 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.le(w)),y.gIf())}}},"call$1","gHv",2,0,null,255,[]],
+a.hf.u(0,new H.GD(H.le(w)),y.gIf())}}},"call$1","gHv",2,0,null,258,[]],
 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,577,[]],
+return z},"call$1","gir",2,0,null,580,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -21085,15 +21162,15 @@
 C.xk.du(a)
 return a}}},
 q6:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,[],23,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,"{{")
@@ -21101,32 +21178,32 @@
 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,[],23,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:343;a",
+"^":"Tp:346;a",
 call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],23,[],"call"],
 $isEH:true},
-w9:{
-"^":"Tp:108;",
+w10:{
+"^":"Tp:113;",
 call$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,578,[],579,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,581,[],582,[],"call"],
 $isEH:true},
 yL:{
-"^":"ndx;",
+"^":"nd;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-351",function(){return[C.nJ]}],
+"^":["a;KM:X0=-412",function(){return[C.nJ]}],
 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
@@ -21139,12 +21216,12 @@
 this.Uc(a)
 $.Bh=$.Bh+1
 this.z2(a,a.dZ)
-$.Bh=$.Bh-1},"call$0","gLi",0,0,null],
+$.Bh=$.Bh-1},"call$0","gUr",0,0,null],
 i4:[function(a){if(a.dZ==null)this.Ec(a)
 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,580,[]],
+this.d0(a,b)}},"call$1","gET",2,0,null,583,[]],
 d0:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=z.Ja(b,"template")
@@ -21155,7 +21232,7 @@
 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,581,[]],
+a.B7.u(0,v,x)},"call$1","gcY",2,0,null,584,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
 z=J.x(b)
@@ -21163,7 +21240,7 @@
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,258,[]],
+return y},"call$1","gAt",2,0,null,261,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
 this.gKE(a)
@@ -21175,12 +21252,12 @@
 y=typeof b==="object"&&b!==null&&!!y.$ishs?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,258,[]],
+return z},"call$1","gQb",2,0,null,261,[]],
 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,582,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,585,[]],
 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,[],227,[],228,[]],
+if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
 fk:[function(a){if(J.ak(a.dZ)==null)return
 this.gQg(a).aN(0,this.ghW(a))},"call$0","goQ",0,0,null],
@@ -21191,7 +21268,7 @@
 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,583,12,[],23,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,586,12,[],23,[]],
 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,[]],
@@ -21222,7 +21299,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,77,12,[],282,[],262,[]],
+return t}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
 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
@@ -21243,14 +21320,14 @@
 J.AA(M.Ky(a))
 y=this.gKE(a)
 for(;y!=null;){A.zM(y)
-y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,107],
+y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,112],
 BT:[function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+this.gqn(a)+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+this.gqn(a)+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.Vx(this.gKE(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,77,584,[]],
+A.Vx(this.gKE(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,77,587,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
@@ -21264,7 +21341,7 @@
 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,585,586,[]],
+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,588,589,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -21284,7 +21361,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,[],23,[],245,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],23,[],248,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -21308,7 +21385,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,261,[],587,[],294,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,264,[],590,[],297,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -21320,7 +21397,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+this.gqn(a)+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,588,410,[]],
+this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,591,384,[]],
 ea:[function(a,b,c,d){var z,y,x
 z=$.SS()
 y=z.Im(C.R5)
@@ -21329,7 +21406,7 @@
 if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.le(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},"call$3","gtW",6,0,null,6,[],589,[],265,[]],
+if(y)z.To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},"call$3","gtW",6,0,null,6,[],592,[],268,[]],
 $iszs:true,
 $ishs:true,
 $isd3:true,
@@ -21338,31 +21415,31 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,[],23,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:108;b",
+"^":"Tp:113;b",
 call$0:[function(){return this.b},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 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,289,[],"call"],
+if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a))},"call$1",null,2,0,null,261,[],"call"],
+return J.AA(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a))},"call$1",null,2,0,null,264,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:343;b,c,d,e",
+"^":"Tp:346;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)
@@ -21372,26 +21449,26 @@
 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,[],590,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],593,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:225;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:107;a,b,c",
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,589,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;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+"())")
-y=J.ZZ(this.b,3)
+y=J.D8(this.b,3)
 x=C.FS.t(0,y)
 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,282,[],261,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,285,[],264,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:225;c,d,e",
+"^":"Tp:107;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.Hr(z)
@@ -21403,25 +21480,25 @@
 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,410,[],"call"],
+x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:225;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 x.h(0,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,237,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,237,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -21429,17 +21506,17 @@
 this.Jq.ed()
 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,228,[]],
+this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,234,[]],
 ho:[function(a){var z,y,x,w,v
 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()
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,592,253,[]],
+return}}},"call$1","giz",2,0,595,256,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["GN;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -21454,7 +21531,7 @@
 C.Iv.G6(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-351",function(){return[C.nJ]}],
+"^":["qE+zs;KM:X0=-412",function(){return[C.nJ]}],
 $iszs:true,
 $ishs:true,
 $isd3:true,
@@ -21477,30 +21554,30 @@
 if(z!=null){z.ed()
 this.ih=null}},"call$0","gol",0,0,null],
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"call$0","gv6",0,0,107]},
+this.Ws()}},"call$0","gv6",0,0,112]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 Bl:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
-return},"call$1",null,2,0,null,237,[],"call"],
+return},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,593,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,596,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,593,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,596,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:225;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
 $isEH:true},
 jh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
@@ -21510,9 +21587,9 @@
 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,23,[],273,[],11,[]],
+return a}},"call$3","jo",6,0,null,23,[],276,[],11,[]],
 W6:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
@@ -21523,59 +21600,59 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],237,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],237,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 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,21,[],594,[],"call"],
+return b}},"call$2",null,4,0,null,21,[],597,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:343;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,21,[],237,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,21,[],108,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:343;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,21,[],594,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:225;a",
-call$1:[function(a){return this.a},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return this.a},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:343;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,21,[],594,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:225;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
 $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.$iscX)?z.zV(a," "):a
-return z},"call$1","qP",2,0,190,274,[]],
+return z},"call$1","qP",2,0,195,277,[]],
 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.$iscX)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,190,274,[]],
+return z},"call$1","Fx",2,0,195,277,[]],
 o8:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,427,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,402,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:225;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,427,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,402,[],"call"],
 $isEH:true},
 e9:{
-"^":"ve;",
+"^":"T4;",
 cl:[function(a,b,c){var z,y,x
 if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
@@ -21590,24 +21667,24 @@
 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
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,595,262,[],12,[],261,[]],
-CE:[function(a){return new T.G0(this)},"call$1","gb4",2,0,null,258,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,598,265,[],12,[],264,[]],
+CE:[function(a){return new T.G0(this)},"call$1","gb4",2,0,null,261,[]]},
 Xy:{
-"^":"Tp:343;a,b,c",
+"^":"Tp:346;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
 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,282,[],261,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,285,[],264,[],"call"],
 $isEH:true},
 G0:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$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,282,[],"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,285,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -21617,14 +21694,14 @@
 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)
 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,225,274,[]],
-gP:[function(a){return this.Y7},null,null,1,0,108,"value",353],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,107,277,[]],
+gP:[function(a){return this.Y7},null,null,1,0,113,"value",355],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 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,225,274,[],"value",353],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,107,277,[],"value",355],
 yB:function(a,b,c){var z,y,x,w,v
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -21638,14 +21715,14 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:225;a",
+"^":"Tp:107;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,18,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;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,390,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -21658,13 +21735,13 @@
 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,390,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,441,[],"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,275,[],267,[]],
+return z.gLv()},"call$2","ly",4,0,null,278,[],270,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -21694,79 +21771,79 @@
 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.le(u)),b)},"call$3","wA",6,0,null,275,[],23,[],267,[]],
+else H.vn(p).PU(new H.GD(H.le(u)),b)},"call$3","wA",6,0,null,278,[],23,[],270,[]],
 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,274,[]],
-lP:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
-$isEH:true},
+return a},"call$1","Af",2,0,null,277,[]],
 Uf:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 Ra:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.p0(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.p0(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:343;",
-call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.Hb(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.Hb(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:343;",
+"^":"Tp:346;",
+call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
+$isEH:true},
+w4:{
+"^":"Tp:346;",
 call$2:[function(a,b){var z=H.uK(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,123,[],110,[],"call"],
-$isEH:true},
-w4:{
-"^":"Tp:225;",
-call$1:[function(a){return a},"call$1",null,2,0,null,123,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,128,[],115,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:225;",
-call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,123,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return a},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:225;",
-call$1:[function(a){return a!==!0},"call$1",null,2,0,null,123,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,128,[],"call"],
+$isEH:true},
+w9:{
+"^":"Tp:107;",
+call$1:[function(a){return a!==!0},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
@@ -21808,11 +21885,11 @@
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-Qh:[function(a){},"call$1","gVj",2,0,null,267,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,270,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,267,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,270,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21821,14 +21898,14 @@
 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,267,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,270,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
 "^":"cfS;Jd",
 xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,18,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gXf",2,0,null,280,[]]},
+a.yc(0,this.Jd)},"call$1","gXf",2,0,null,283,[]]},
 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,18,[]],
@@ -21837,14 +21914,14 @@
 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,348,[]],
+return y},"call$1","gEW",2,0,null,351,[]],
 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,390,[]],
+return x},"call$1","gA2",2,0,null,441,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21854,21 +21931,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,390,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gXj",2,0,null,276,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,441,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gXj",2,0,null,279,[]],
 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","gX7",2,0,null,276,[]],
+return y},"call$1","gX7",2,0,null,279,[]],
 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","gvO",2,0,null,18,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,390,[]],
+return x},"call$1","ghH",2,0,null,18,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,441,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
@@ -21886,23 +21963,23 @@
 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","gXf",2,0,null,390,[]]},
+return x},"call$1","gXf",2,0,null,441,[]]},
 Os:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,123,[],"call"],
+return z},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
 return z},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay0;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.k8},"call$1","gVj",2,0,null,267,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gBu",2,0,null,274,[]],
+Qh:[function(a){this.Lv=a.k8},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -21912,27 +21989,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,267,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay0;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,267,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,186,[],18,[],"call"],
+return a},"call$2",null,4,0,null,191,[],18,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay0;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
@@ -21947,19 +22024,19 @@
 y=a.tI(z.gP(z))
 x=J.RE(y)
 if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.le(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,267,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gBu",2,0,null,274,[]],
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:225;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,586,[],"call"],
+"^":"Tp:107;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,589,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay0;wz<,KL,bO,tj,Lv,k6",
@@ -21970,8 +22047,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,267,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -21993,14 +22070,14 @@
 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,267,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay0;hP<,KL,bO,tj,Lv,k6",
@@ -22013,19 +22090,19 @@
 x=new H.GD(H.le(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,267,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:225;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,586,[],"call"],
+"^":"Tp:107;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,589,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay0;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -22035,19 +22112,19 @@
 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,267,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 ja:{
-"^":"Tp:225;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.zw(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:107;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.zw(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
 $isEH:true},
 zw:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay0;hP<,re<,KL,bO,tj,Lv,k6",
@@ -22064,23 +22141,23 @@
 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.le(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,267,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:225;",
-call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,123,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:571;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,586,[],"call"],
+"^":"Tp:574;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,589,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay0;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -22092,21 +22169,21 @@
 if(typeof y==="object"&&y!==null&&!!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,267,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
 J1:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;kF,bm",
 $isfk:true},
 wL:{
-"^":"a:225;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gtm",2,0,null,596,[]],
+"^":"a:107;lR,ex",
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gQl",2,0,null,599,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -22126,33 +22203,33 @@
 if(!(y<x))break
 x=z.t(a,y)
 if(y>=b.length)return H.e(b,y)
-if(!J.de(x,b[y]))return!1;++y}return!0},"call$2","OE",4,0,null,123,[],183,[]],
+if(!J.de(x,b[y]))return!1;++y}return!0},"call$2","OE",4,0,null,128,[],188,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,276,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,279,[]],
 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,277,[],23,[]],
+return a^a>>>6},"call$2","uN",4,0,null,280,[],23,[]],
 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","Hj",2,0,null,277,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,280,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,597,18,[],123,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,18,[],186,[],123,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,600,18,[],128,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,18,[],191,[],128,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
 $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","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22163,7 +22240,7 @@
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22173,7 +22250,7 @@
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22186,7 +22263,7 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22197,7 +22274,7 @@
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
@@ -22207,7 +22284,7 @@
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22220,7 +22297,7 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22234,7 +22311,7 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22248,7 +22325,7 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22261,7 +22338,7 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22274,7 +22351,7 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22287,8 +22364,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:343;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,598,[],599,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,601,[],602,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -22297,7 +22374,7 @@
 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 "+b+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gXO",0,4,null,77,77,600,[],23,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gXO",0,4,null,77,77,603,[],23,[]],
 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],
@@ -22315,7 +22392,7 @@
 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","gHr",4,0,null,126,[],601,[]],
+return a},"call$2","gHr",4,0,null,131,[],604,[]],
 qL:[function(a,b){var z,y
 if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
 this.Sk.toString
@@ -22326,7 +22403,7 @@
 if(z){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,126,[],127,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,131,[],132,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -22337,7 +22414,7 @@
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
 this.Sk.toString
-return new U.uk(x,a,y)},"call$1","gvB",2,0,null,126,[]],
+return new U.uk(x,a,y)},"call$1","gvB",2,0,null,131,[]],
 Dl:[function(){var z,y,x,w
 if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -22427,34 +22504,34 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},"call$0","gRa",0,0,null],
-pT:[function(a){var z,y
+return y},"call$0","gJ1",0,0,null],
+pT0:[function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
 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,602,[]],
+return y},function(){return this.pT0("")},"Ud","call$1",null,"gwo",0,2,null,333,605,[]],
 Fj:[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.Fj("")},"tw","call$1",null,"gSE",0,2,null,330,602,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.Fj("")},"tw","call$1",null,"gSE",0,2,null,333,605,[]]}}],["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,278,109,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,281,114,[]],
 Ae:{
-"^":"a;vH>-484,P>-603",
+"^":"a;vH>-386,P>-606",
 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,225,91,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,491,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,367,"toString"],
+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,107,91,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,371,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,370,"toString"],
 $isAe:true,
 "@":function(){return[C.nJ]},
 "<>":[3],
-static:{iz:[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:"GR",args:[J.im,a]}},this.$receiver,"Ae")},47,[],23,[],"new IndexedValue"]}},
+static:{iz:[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")},47,[],23,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -22475,7 +22552,7 @@
 $asmW:function(a){return[[K.Ae,a]]},
 $ascX:function(a){return[[K.Ae,a]]}},
 vR:{
-"^":"Yl;WS,wX,CD",
+"^":"AC;WS,wX,CD",
 gl:function(){return this.CD},
 G:[function(){var z,y
 z=this.WS
@@ -22484,21 +22561,21 @@
 this.CD=H.VM(new K.Ae(y,z.gl()),[null])
 return!0}this.CD=null
 return!1},"call$0","gqy",0,0,null],
-$asYl:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
+$asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
 y1:[function(a,b){var z,y,x
 if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
 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","tm",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","tm",4,0,null,282,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 aK:[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","aN",2,0,null,280,[]],
+default:return a}},"call$1","aN",2,0,null,283,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22604,30 +22681,30 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,604,86,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,607,86,[]]},
 cfS:{
 "^":"fr;",
 W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,18,[]],
 LT:[function(a){a.wz.RR(0,this)
 this.xn(a)},"call$1","gff",2,0,null,18,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,390,[]],
+this.xn(a)},"call$1","gEW",2,0,null,441,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,390,[]],
+this.xn(a)},"call$1","gA2",2,0,null,441,[]],
 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,390,[]],
-ti:[function(a){return this.xn(a)},"call$1","gXj",2,0,null,276,[]],
+this.xn(a)},"call$1","gES",2,0,null,441,[]],
+ti:[function(a){return this.xn(a)},"call$1","gXj",2,0,null,279,[]],
 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","gX7",2,0,null,276,[]],
+this.xn(a)},"call$1","gX7",2,0,null,279,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","gvO",2,0,null,18,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,390,[]],
+this.xn(a)},"call$1","ghH",2,0,null,18,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,441,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
 this.xn(a)},"call$1","glf",2,0,null,91,[]],
@@ -22635,10 +22712,12 @@
 this.xn(a)},"call$1","ghe",2,0,null,91,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gXf",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/observatory_elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gXf",2,0,null,283,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["uL;hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["V0;kW%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+guw:[function(a){return a.kW},null,null,1,0,408,"app",355,397],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,551,23,[],"app",355],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22651,23 +22730,24 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.G6(a)
-return a},null,null,0,0,108,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[483]}],["script_ref_element","package:observatory/src/observatory_elements/script_ref.dart",,A,{
+return a},null,null,0,0,113,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[608],
+V0:{
+"^":"uL+Pi;",
+$isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-484,AP,fn,tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRd:[function(a){return a.zw},null,null,1,0,491,"line",353,354],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,392,23,[],"line",353],
-gO3:[function(a){var z
-if(a.hm!=null&&a.tY!=null){z=this.Mq(a,J.UQ(a.tY,"id"))
-if(J.u6(a.zw,0))return z
-else return z+"?line="+H.d(a.zw)}return""},null,null,1,0,367,"url"],
+"^":["T5;zw%-386,AP,fn,tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRd:[function(a){return a.zw},null,null,1,0,371,"line",355,397],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,372,23,[],"line",355],
+grp:[function(a){if(J.u6(a.zw,0))return Q.xI.prototype.grp.call(this,a)
+return H.d(Q.xI.prototype.grp.call(this,a))+"?line="+H.d(a.zw)},null,null,1,0,370,"objectId"],
 gJp:[function(a){var z,y
 if(a.tY==null)return""
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return J.UQ(y,"user_name")
-else return H.d(J.UQ(y,"user_name"))+":"+H.d(a.zw)},null,null,1,0,367,"hoverText"],
+else return H.d(J.UQ(y,"user_name"))+":"+H.d(a.zw)},null,null,1,0,370,"hoverText"],
 goc:[function(a){var z,y,x
 z=a.tY
 if(z==null)return""
@@ -22675,8 +22755,8 @@
 z=J.U6(y)
 x=z.yn(y,J.WB(z.cn(y,"/"),1))
 if(J.u6(a.zw,0))return x
-else return x+":"+H.d(a.zw)},null,null,1,0,367,"name"],
-"@":function(){return[C.Ur]},
+else return x+":"+H.d(a.zw)},null,null,1,0,370,"name"],
+"@":function(){return[C.h9]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22685,31 +22765,25 @@
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.zw=-1
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.c0.ZL(a)
 C.c0.G6(a)
-return a},null,null,0,0,108,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[605],
+return a},null,null,0,0,113,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[609],
 T5:{
 "^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/observatory_elements/script_view.dart",,U,{
+$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V19;Uz%-606,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gNl:[function(a){return a.Uz},null,null,1,0,607,"script",353,354],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,608,23,[],"script",353],
+"^":["oaa;Uz%-610,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gNl:[function(a){return a.Uz},null,null,1,0,611,"script",355,397],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,612,23,[],"script",355],
 PQ:[function(a,b){if(J.de(b.gu9(),-1))return"min-width:32px;"
 else if(J.de(b.gu9(),0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,609,176,[],"hitsStyle"],
-wH:[function(a,b,c,d){var z,y,x
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null){N.Jx("").To("No isolate found.")
-return}x="/"+z+"/coverage"
-a.hm.gDF().fB(x).ml(new U.qq(a,y)).OA(new U.FC())},"call$3","gWp",6,0,374,18,[],303,[],74,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,613,181,[],"hitsStyle"],
+wH:[function(a,b,c,d){a.pC.oX("coverage").ml(new U.qq(a)).OA(new U.FC())},"call$3","gWp",6,0,425,18,[],306,[],74,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22722,45 +22796,45 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.G6(a)
-return a},null,null,0,0,108,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[610],
-V19:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[614],
+oaa:{
+"^":"PO+Pi;",
 $isd3:true},
 qq:{
-"^":"Tp:355;a-77,b-77",
+"^":"Tp:357;a-77",
 call$1:[function(a){var z,y
-this.b.oe(J.UQ(a,"coverage"))
 z=this.a
 y=J.RE(z)
-y.ct(z,C.YH,"",y.gXa(z))},"call$1",null,2,0,355,611,[],"call"],
+y.gpC(z).oe(J.UQ(a,"coverage"))
+y.ct(z,C.YH,"",y.gXa(z))},"call$1",null,2,0,357,615,[],"call"],
 $isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[358],
+"+ScriptViewElement_refreshCoverage_closure":[415],
 FC:{
-"^":"Tp:343;",
-call$2:[function(a,b){P.JS("refreshCoverage "+H.d(a)+" "+H.d(b))},"call$2",null,4,0,343,18,[],478,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){P.JS("refreshCoverage "+H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[358]}],["service_ref_element","package:observatory/src/observatory_elements/service_ref.dart",,Q,{
+"+ScriptViewElement_refreshCoverage_closure":[415]}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Ds;tY%-349,Pe%-360,m0%-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gnv:[function(a){return a.tY},null,null,1,0,352,"ref",353,354],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,355,23,[],"ref",353],
-gjT:[function(a){return a.Pe},null,null,1,0,371,"internal",353,354],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,372,23,[],"internal",353],
-gAq:[function(a){return a.m0},null,null,1,0,502,"isolate",353,354],
-sAq:[function(a,b){a.m0=this.ct(a,C.Z8,a.m0,b)},null,null,3,0,503,23,[],"isolate",353],
+"^":["Sq;tY%-410,Pe%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gnv:[function(a){return a.tY},null,null,1,0,354,"ref",355,397],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,357,23,[],"ref",355],
+gjT:[function(a){return a.Pe},null,null,1,0,380,"internal",355,397],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,381,23,[],"internal",355],
 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.gJp(a))},"call$1","gma",2,0,153,227,[],"refChanged"],
-gO3:[function(a){var z=a.tY
-if(z!=null)return this.Mq(a,J.UQ(z,"id"))
-return""},null,null,1,0,367,"url"],
+this.ct(a,C.bA,"",this.gJp(a))},"call$1","gma",2,0,158,233,[],"refChanged"],
+gO3:[function(a){var z=a.pC
+if(z==null||a.tY==null)return""
+return z.rn(this.grp(a))},null,null,1,0,370,"url"],
+grp:[function(a){var z=a.tY
+return z==null?"":J.UQ(z,"id")},null,null,1,0,370,"objectId"],
 gJp:[function(a){var z,y
 z=a.tY
 if(z==null)return""
 y=J.UQ(z,"name")
-return y!=null?y:""},null,null,1,0,367,"hoverText"],
+return y!=null?y:""},null,null,1,0,370,"hoverText"],
 goc:[function(a){var z,y
 z=a.tY
 if(z==null)return"NULL REF"
@@ -22768,13 +22842,8 @@
 if(J.UQ(z,y)!=null)return J.UQ(a.tY,y)
 else if(J.UQ(a.tY,"name")!=null)return J.UQ(a.tY,"name")
 else if(J.UQ(a.tY,"user_name")!=null)return J.UQ(a.tY,"user_name")
-return""},null,null,1,0,367,"name"],
-vD:[function(a,b){this.ct(a,C.bD,0,1)},"call$1","gQ1",2,0,153,227,[],"isolateChanged"],
-Mq:[function(a,b){var z=a.hm
-if(z==null)return""
-else if(a.m0==null)return z.gZ6().kP(b)
-else return J.uY(z.gZ6(),J.F8(a.m0),b)},"call$1","gLc",2,0,534,612,[],"relativeLink",370],
-"@":function(){return[C.JD]},
+return""},null,null,1,0,370,"name"],
+"@":function(){return[C.Ldf]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22782,22 +22851,21 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.wU.ZL(a)
 C.wU.G6(a)
-return a},null,null,0,0,108,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[613],
-Ds:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_frame_element","package:observatory/src/observatory_elements/stack_frame.dart",,K,{
+return a},null,null,0,0,113,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[616],
+Sq:{
+"^":"PO+Pi;",
+$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["V20;Va%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gz1:[function(a){return a.Va},null,null,1,0,352,"frame",353,354],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,355,23,[],"frame",353],
+"^":["q2;Va%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gz1:[function(a){return a.Va},null,null,1,0,354,"frame",355,397],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,357,23,[],"frame",355],
 "@":function(){return[C.pE]},
 static:{an:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
@@ -22813,19 +22881,18 @@
 a.X0=v
 C.dX.ZL(a)
 C.dX.G6(a)
-return a},null,null,0,0,108,"new StackFrameElement$created"]}},
-"+StackFrameElement":[614],
-V20:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/observatory_elements/stack_trace.dart",,X,{
+return a},null,null,0,0,113,"new StackFrameElement$created"]}},
+"+StackFrameElement":[617],
+q2:{
+"^":"PO+Pi;",
+$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
-Vu:{
-"^":["V21;V4%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtN:[function(a){return a.V4},null,null,1,0,352,"trace",353,354],
-stN:[function(a,b){a.V4=this.ct(a,C.kw,a.V4,b)},null,null,3,0,355,23,[],"trace",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP("stacktrace")
-a.hm.gDF().fB(z).ml(new X.At(a)).OA(new X.Sb()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-"@":function(){return[C.js]},
+uwf:{
+"^":["q3;Up%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtN:[function(a){return a.Up},null,null,1,0,354,"trace",355,397],
+stN:[function(a,b){a.Up=this.ct(a,C.kw,a.Up,b)},null,null,3,0,357,23,[],"trace",355],
+RF:[function(a,b){a.pC.oX("stacktrace").ml(new X.At(a)).OA(new X.Sb()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+"@":function(){return[C.Yi]},
 static:{bV:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
 z=R.Jk(z)
@@ -22834,36 +22901,36 @@
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.V4=z
+a.Up=z
 a.SO=y
 a.B7=x
 a.X0=v
 C.bg.ZL(a)
 C.bg.G6(a)
-return a},null,null,0,0,108,"new StackTraceElement$created"]}},
-"+StackTraceElement":[615],
-V21:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new StackTraceElement$created"]}},
+"+StackTraceElement":[618],
+q3:{
+"^":"PO+Pi;",
 $isd3:true},
 At:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sV4(z,y.ct(z,C.kw,y.gV4(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sUp(z,y.ct(z,C.kw,y.gUp(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+StackTraceElement_refresh_closure":[358],
+"+StackTraceElement_refresh_closure":[415],
 Sb:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while reloading stack trace: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while reloading stack trace: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+StackTraceElement_refresh_closure":[358]}],["template_binding","package:template_binding/template_binding.dart",,M,{
+"+StackTraceElement_refresh_closure":[415]}],["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)
 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,124,[]],
+default:return z.gLm(a)}},"call$1","nc",2,0,null,129,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
@@ -22875,7 +22942,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.XI(z,u,w,t)},"call$2","Nc",4,0,null,261,[],281,[]],
+return new M.XI(z,u,w,t)},"call$2","Nc",4,0,null,264,[],284,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -22885,16 +22952,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,261,[],144,[],282,[],281,[],283,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,264,[],149,[],285,[],284,[],286,[]],
 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,261,[]],
+return},"call$1","ay",2,0,null,264,[]],
 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,261,[],281,[]],
+if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,264,[],284,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -22905,7 +22972,7 @@
 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,124,[],281,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,129,[],284,[]],
 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.$ishs,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
@@ -22935,7 +23002,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,77,288,[],261,[],282,[],283,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,77,291,[],264,[],285,[],286,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -22953,13 +23020,13 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","jF",8,0,null,86,[],12,[],261,[],281,[]],
+return z},"call$4","tE",8,0,null,86,[],12,[],264,[],284,[]],
 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","KQ",4,0,null,202,[],282,[]],
+z=z.nextSibling}},"call$2","St",4,0,null,209,[],285,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -22974,12 +23041,12 @@
 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.hs(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,261,[]],
+return x},"call$1","La",2,0,null,264,[]],
 wR:[function(a){var z=J.RE(a)
 if(typeof a==="object"&&a!==null&&!!z.$iscv)if(z.gqn(a)!=="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,289,[]],
+return z},"call$1","xS",2,0,null,292,[]],
 V2:{
 "^":"hs;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
@@ -23000,10 +23067,10 @@
 if(w){J.Vs(y).Rz(0,b)
 v=z.Nj(b,0,J.xH(z.gB(b),1))}else v=b
 z=d!=null?d:""
-x=new M.D8(w,y,c,null,null,v,z)
+x=new M.BT(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,77,12,[],282,[],262,[]]},
-D8:{
+return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
+BT:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
@@ -23024,14 +23091,14 @@
 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,228,[]]},
+if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,234,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null]},
-YJ:{
-"^":"Tp:108;",
+DO:{
+"^":"Tp:113;",
 call$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -23048,25 +23115,25 @@
 return x.length===1?C.mt:C.Nm.gtH(x)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,228,[]],
+J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,153,18,[]]},
+O.Y3()},"call$1","gqf",2,0,158,18,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,228,[]],
+J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,234,[]],
 FC:[function(a){var z,y,x,w
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
@@ -23075,7 +23142,7 @@
 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.$ishs?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,153,18,[]],
+if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,158,18,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23084,9 +23151,9 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,124,[]]}},
+return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,129,[]]}},
 r0:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -23095,12 +23162,12 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,285,[],"call"],
+return z},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:225;b",
+"^":"Tp:107;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,285,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
@@ -23109,7 +23176,7 @@
 if(this.Gh(a)===!0)return
 z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
 C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},"call$1","gH0",2,0,null,228,[]],
+this.Dh=z},"call$1","gH0",2,0,null,234,[]],
 Gh:[function(a){var z,y,x
 z=this.eS
 y=J.x(z)
@@ -23118,7 +23185,7 @@
 z=J.m4(X.TR.prototype.gH.call(this))
 return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,228,[]],
+return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,234,[]],
 C7:[function(){var z=this.Dh
 if(z!=null){z.disconnect()
 this.Dh=null}},"call$0","gln",0,0,null],
@@ -23128,18 +23195,18 @@
 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,153,18,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,158,18,[]],
 $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,23,[]]}},
 hB:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,21,[],616,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,21,[],619,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:225;",
-call$1:[function(a){return 0},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return 0},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -23163,7 +23230,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,77,12,[],282,[],262,[]]},
+return z},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
 XI:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 hs:{
@@ -23173,7 +23240,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,77,12,[],282,[],262,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23210,9 +23277,9 @@
 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,77,12,[],282,[],262,[]]},
+return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
 DT:{
-"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
+"^":"V2;lr,xT?,kr<,Dsl,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
 glN:function(){var z,y
 z=this.N1
@@ -23243,7 +23310,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,77,12,[],282,[],262,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23273,7 +23340,7 @@
 return}},"call$1","gC8",2,0,null,12,[]],
 jq:[function(){var z=this.kr
 if(!z.t9){z.t9=!0
-P.rb(z.gjM())}},"call$0","gvj",0,0,null],
+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)
@@ -23290,7 +23357,7 @@
 y=u}t=M.Fz(x,y)
 M.HP(t,w,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,77,77,77,282,[],281,[],283,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,77,77,77,285,[],284,[],286,[]],
 gzH:function(){return this.xT},
 gnv:function(a){var z,y,x,w,v
 this.Sy()
@@ -23329,7 +23396,7 @@
 if(a!=null)v.sQO(a)
 else if(w)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,77,617,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,77,620,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
@@ -23339,13 +23406,13 @@
 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","Tkw",4,0,null,261,[],284,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","Tkw",4,0,null,264,[],287,[]],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,258,[]],pZ:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,261,[]],pZ:[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)
@@ -23360,27 +23427,27 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","fo",2,0,null,285,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","fo",2,0,null,288,[]],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,258,[],285,[],286,[]],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,261,[],288,[],289,[]],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,287,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,290,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 z.textContent=$.cz()+" { display: none; }"
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:153;",
+"^":"Tp:158;",
 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.$ishs?a:M.Ky(a)))}},"call$1",null,2,0,null,258,[],"call"],
+M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a)))}},"call$1",null,2,0,null,261,[],"call"],
 $isEH:true},
-DO:{
-"^":"Tp:225;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,427,[],"call"],
+lP:{
+"^":"Tp:107;",
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,402,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -23399,7 +23466,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:343;a,b,c,d",
+"^":"Tp:346;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
@@ -23430,7 +23497,7 @@
 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,618,23,[]],
+return y+H.d(z[3])},"call$1","gBg",2,0,621,23,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -23441,7 +23508,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,619,620,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,622,623,[]],
 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",
@@ -23462,7 +23529,7 @@
 u=this.eD
 v.push(L.ao(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.VU(this))
-this.Az(w.gP(w))},"call$0","gjM",0,0,108],
+this.Az(w.gP(w))},"call$0","gjM",0,0,113],
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
@@ -23475,7 +23542,7 @@
 x=this.xG
 x=x!=null?x:[]
 w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},"call$1","ghC",2,0,null,228,[]],
+if(w.length!==0)this.El(w)},"call$1","gbe",2,0,null,234,[]],
 wx:[function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.e9.N1
@@ -23501,7 +23568,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,47,[],202,[],621,[],283,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,47,[],209,[],624,[],286,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23518,7 +23585,7 @@
 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,47,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gLu",2,0,null,47,[]],
 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
@@ -23544,9 +23611,9 @@
 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,622,252,[]],
+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,625,255,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,283,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,286,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23561,21 +23628,21 @@
 this.FS=null}this.e9.kr=null
 this.pq=!0},"call$0","gJK",0,0,null]},
 ts:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return[a]},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:493;a",
+"^":"Tp:536;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,620,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,623,[],"call"],
 $isEH:true},
 VU:{
-"^":"Tp:225;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,373,[],"call"],
+"^":"Tp:107;b",
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,424,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -23591,11 +23658,11 @@
 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,77,12,[],282,[],262,[]]},
+return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,228,[]]},
+J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]]},
 wl:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -23612,9 +23679,9 @@
 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,77,12,[],282,[],262,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-ve:{
+T4:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
 "^":"",
 TR:{
@@ -23642,43 +23709,65 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,373,[],"call"],
-$isEH:true}}],])
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,424,[],"call"],
+$isEH:true}}],["vm_element","package:observatory/src/elements/vm_element.dart",,R,{
+"^":"",
+Zt:{
+"^":["Dsd;Jh%-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gzf:[function(a){return a.Jh},null,null,1,0,626,"vm",355,397],
+szf:[function(a,b){a.Jh=this.ct(a,C.DD,a.Jh,b)},null,null,3,0,627,23,[],"vm",355],
+"@":function(){return[C.rm]},
+static:{xip:[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.Qh.ZL(a)
+C.Qh.G6(a)
+return a},null,null,0,0,113,"new VMElement$created"]}},
+"+VMElement":[628],
+Dsd:{
+"^":"uL+Pi;",
+$isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
+J.O.$isRz=true
+J.O.$asRz=[J.O]
 J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
+J.P.$isRz=true
+J.P.$asRz=[J.P]
 J.P.$isa=true
 J.im.$isint=true
-J.im.$isTx=true
-J.im.$asTx=[J.P]
-J.im.$isTx=true
-J.im.$asTx=[J.P]
-J.im.$isTx=true
-J.im.$asTx=[J.P]
+J.im.$isRz=true
+J.im.$asRz=[J.P]
+J.im.$isRz=true
+J.im.$asRz=[J.P]
+J.im.$isRz=true
+J.im.$asRz=[J.P]
 J.im.$isa=true
 J.GW.$isdouble=true
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
+J.GW.$isRz=true
+J.GW.$asRz=[J.P]
+J.GW.$isRz=true
+J.GW.$asRz=[J.P]
 J.GW.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
 W.M5.$isa=true
-N.qV.$isTx=true
-N.qV.$asTx=[N.qV]
+N.qV.$isRz=true
+N.qV.$asRz=[N.qV]
 N.qV.$isa=true
 P.a6.$isa6=true
-P.a6.$isTx=true
-P.a6.$asTx=[P.a6]
+P.a6.$isRz=true
+P.a6.$asRz=[P.a6]
 P.a6.$isa=true
 P.Od.$isa=true
 J.Q.$isList=true
@@ -23763,17 +23852,17 @@
 P.Ys.$isej=true
 P.Ys.$isa=true
 X.TR.$isa=true
+F.d3.$isa=true
 T.z2.$isz2=true
 T.z2.$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
 P.qh.$isa=true
-W.Oq.$isea=true
-W.Oq.$isa=true
+W.CX.$isea=true
+W.CX.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -23786,7 +23875,7 @@
 A.zs.$isD0=true
 A.zs.$isa=true
 A.bS.$isa=true
-L.Y2.$isa=true
+G.Y2.$isa=true
 P.uq.$isa=true
 P.iD.$isiD=true
 P.iD.$isa=true
@@ -23801,18 +23890,17 @@
 W.I0.$isKV=true
 W.I0.$isD0=true
 W.I0.$isa=true
-W.DD.$isea=true
-W.DD.$isa=true
-L.bv.$isa=true
+W.Hy.$isea=true
+W.Hy.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
-L.c2.$isc2=true
-L.c2.$isa=true
-L.kx.$iskx=true
-L.kx.$isa=true
-L.rj.$isa=true
+G.kx.$iskx=true
+G.kx.$isa=true
+G.rj.$isa=true
+G.c2.$isc2=true
+G.c2.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -23843,14 +23931,14 @@
 P.JB.$isa=true
 P.Z0.$isZ0=true
 P.Z0.$isa=true
-L.Vi.$isVi=true
-L.Vi.$isa=true
+G.Vi.$isVi=true
+G.Vi.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
 W.D0.$isD0=true
 W.D0.$isa=true
-P.Tx.$isTx=true
-P.Tx.$isa=true
+P.Rz.$isRz=true
+P.Rz.$isa=true
 P.aY.$isaY=true
 P.aY.$isa=true
 P.lO.$islO=true
@@ -23860,8 +23948,8 @@
 P.nP.$isnP=true
 P.nP.$isa=true
 P.iP.$isiP=true
-P.iP.$isTx=true
-P.iP.$asTx=[null]
+P.iP.$isRz=true
+P.iP.$asRz=[null]
 P.iP.$isa=true
 P.ti.$isti=true
 P.ti.$isa=true
@@ -23915,6 +24003,7 @@
 J.CC=function(a){return J.RE(a).gmH(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.Co=function(a){return J.RE(a).gcC(a)}
+J.D8=function(a,b){return J.rY(a).yn(a,b)}
 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)}
@@ -23938,6 +24027,7 @@
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
+J.JD=function(a,b){return J.RE(a).R3(a,b)}
 J.Jj=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
@@ -23997,7 +24087,6 @@
 J.Z7=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
 J.ZP=function(a,b){return J.RE(a).Tk(a,b)}
-J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
 J.ak=function(a){return J.RE(a).gNF(a)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
@@ -24015,7 +24104,6 @@
 return J.x(a).n(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.eJ=function(a,b){return J.U6(a).cn(a,b)}
-J.eh=function(a,b){return J.RE(a).Ne(a,b)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.hf=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
@@ -24059,7 +24147,6 @@
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
-J.uY=function(a,b,c){return J.RE(a).r4(a,b,c)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
@@ -24089,7 +24176,7 @@
 C.x0=new J.Jh()
 C.oD=new J.P()
 C.Kn=new J.O()
-C.mI=new K.ndx()
+C.mI=new K.nd()
 C.Us=new A.yL()
 C.nJ=new K.vly()
 C.Wj=new P.JF()
@@ -24099,11 +24186,11 @@
 C.xE=A.wM.prototype
 C.YZ=Q.Tg.prototype
 C.kk=Z.Ps.prototype
-C.WA=new L.WAE("Collected")
-C.l8=new L.WAE("Dart")
-C.nj=new L.WAE("Native")
+C.WA=new G.WAE("Collected")
+C.l8=new G.WAE("Dart")
+C.nj=new G.WAE("Native")
 C.IK=O.CN.prototype
-C.YD=F.vc.prototype
+C.YD=F.HT.prototype
 C.j8=R.E0.prototype
 C.O0=R.lw.prototype
 C.Vy=new A.V3("disassembly-entry")
@@ -24123,16 +24210,17 @@
 C.Gg=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
 C.rc=new A.V3("message-viewer")
+C.rm=new A.V3("vm-element")
 C.NT=new A.V3("top-nav-menu")
-C.js=new A.V3("stack-trace")
-C.Ur=new A.V3("script-ref")
+C.Yi=new A.V3("stack-trace")
+C.h9=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
-C.jFV=new A.V3("isolate-list")
+C.jF=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")
 C.pE=new A.V3("stack-frame")
-C.y2=new A.V3("observatory-application")
+C.kR=new A.V3("observatory-application")
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
@@ -24140,8 +24228,9 @@
 C.KH=new A.V3("json-view")
 C.YQ=new A.V3("function-ref")
 C.QU=new A.V3("library-ref")
-C.Tq=new A.V3("field-view")
-C.JD=new A.V3("service-ref")
+C.EA=new A.V3("isolate-element")
+C.vc=new A.V3("field-view")
+C.Ldf=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
 C.be=new A.V3("instance-view")
@@ -24149,24 +24238,25 @@
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
 C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Oq])
+C.pi=H.VM(new W.e0("click"),[W.CX])
 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.ph=H.VM(new W.e0("message"),[W.DD])
+C.ph=H.VM(new W.e0("message"),[W.Hy])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
 C.Xo=U.AX.prototype
-C.Yu=N.yb.prototype
-C.Vc=K.NM.prototype
+C.h4=N.yb.prototype
+C.RJ=K.NM.prototype
 C.W3=W.zU.prototype
 C.cp=B.pR.prototype
 C.yK=Z.hx.prototype
+C.wx=S.PO.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
 C.XH=X.E7.prototype
-C.Qt=D.St.prototype
+C.Qt=D.Kz.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
 C.jn=J.im.prototype
@@ -24312,7 +24402,7 @@
 C.IF=new N.qV("INFO",800)
 C.cV=new N.qV("SEVERE",1000)
 C.UP=new N.qV("WARNING",900)
-C.S3=A.Zt.prototype
+C.S3=A.oM.prototype
 C.Z3=R.LU.prototype
 C.MG=M.T2.prototype
 I.makeConstantList = function(list) {
@@ -24322,7 +24412,6 @@
 };
 C.HE=I.makeConstantList([0,0,26624,1023,0,0,65534,2047])
 C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.makeConstantList([0,0,26498,1023,65534,34815,65534,18431])
 C.PQ=I.makeConstantList(["active","success","warning","danger","info"])
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
@@ -24339,8 +24428,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zJ)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 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.a5k=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.a5k)
 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"])
@@ -24349,8 +24438,8 @@
 C.S2=W.H9.prototype
 C.kD=A.F1.prototype
 C.SU=A.aQ.prototype
-C.nn=A.Qa.prototype
-C.J7=A.vI.prototype
+C.nn=A.Ya5.prototype
+C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
 C.k0=V.lI.prototype
 C.Pf=Z.uL.prototype
@@ -24361,7 +24450,7 @@
 C.cJ=U.fI.prototype
 C.wU=Q.xI.prototype
 C.dX=K.nm.prototype
-C.bg=X.Vu.prototype
+C.bg=X.uwf.prototype
 C.PU=new H.GD("dart.core.Object")
 C.N4=new H.GD("dart.core.DateTime")
 C.Ts=new H.GD("dart.core.bool")
@@ -24398,7 +24487,6 @@
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
-C.EN=new H.GD("id")
 C.fn=new H.GD("instance")
 C.i6=new H.GD("instruction")
 C.zD=new H.GD("internal")
@@ -24414,7 +24502,6 @@
 C.Cv=new H.GD("line")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.zu=new H.GD("members")
 C.US=new H.GD("messageType")
 C.fQ=new H.GD("methodCountSelected")
 C.UX=new H.GD("msg")
@@ -24423,15 +24510,15 @@
 C.OV=new H.GD("noSuchMethod")
 C.ap=new H.GD("oldHeapUsed")
 C.tI=new H.GD("percent")
-C.qb3=new H.GD("prefix")
 C.vb=new H.GD("profile")
 C.kY=new H.GD("ref")
+C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
-C.bD=new H.GD("relativeLink")
-C.wH=new H.GD("responses")
+C.mE=new H.GD("response")
 C.iF=new H.GD("rootLib")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
+C.XU=new H.GD("sampleCount")
 C.fX=new H.GD("script")
 C.Be=new H.GD("scriptRef")
 C.eC=new H.GD("[]=")
@@ -24446,6 +24533,7 @@
 C.ct=new H.GD("userName")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
+C.DD=new H.GD("vm")
 C.KS=new H.GD("vmName")
 C.z9=new H.GD("void")
 C.lx=A.tz.prototype
@@ -24463,17 +24551,16 @@
 C.z6Y=H.mm('Tg')
 C.eY=H.mm('n6')
 C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
 C.I5=H.mm('JG')
 C.z7=H.mm('G6')
-C.GTO=H.mm('F1')
+C.Ma=H.mm('F1')
 C.nY=H.mm('a')
 C.Yc=H.mm('iP')
 C.kA=H.mm('u7')
 C.PT=H.mm('I2')
 C.Wup=H.mm('LZ')
 C.P0k=H.mm('lI')
+C.Lz=H.mm('PO')
 C.T1=H.mm('Wy')
 C.hG=H.mm('ir')
 C.aj=H.mm('fI')
@@ -24482,9 +24569,12 @@
 C.G4=H.mm('CN')
 C.O4=H.mm('double')
 C.yw=H.mm('int')
+C.Mh=H.mm('Zt')
+C.Lf0=H.mm('uwf')
 C.RcY=H.mm('aQ')
 C.ld=H.mm('AX')
 C.yiu=H.mm('knI')
+C.oW=H.mm('Ya5')
 C.iN=H.mm('yc')
 C.HI=H.mm('Pg')
 C.ila=H.mm('xI')
@@ -24494,29 +24584,30 @@
 C.jV=H.mm('rF')
 C.JZ=H.mm('E7')
 C.wd=H.mm('vj')
-C.CTH=H.mm('St')
+C.JW=H.mm('Ww')
 C.Rg=H.mm('yb')
+C.wHJ=H.mm('Kz')
 C.cx5=H.mm('m8')
 C.l49=H.mm('uL')
 C.yQ=H.mm('EH')
 C.Im=H.mm('X6')
 C.GG=H.mm('PF')
 C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
+C.p5=H.mm('oM')
+C.yD=H.mm('E0')
 C.nG=H.mm('zt')
-C.Xb=H.mm('vc')
 C.yG=H.mm('nm')
-C.px=H.mm('tz')
+C.vA=H.mm('tz')
 C.ow=H.mm('E9')
 C.PV=H.mm('wM')
 C.Db=H.mm('String')
 C.EP=H.mm('NM')
-C.FsU=H.mm('vI')
 C.Bm=H.mm('XP')
 C.Tn=H.mm('T2')
 C.hg=H.mm('hd')
 C.dd=H.mm('pR')
 C.Ud8=H.mm('Ps')
+C.Io=H.mm('HT')
 C.HL=H.mm('bool')
 C.Qf=H.mm('Null')
 C.HH=H.mm('dynamic')
@@ -24525,11 +24616,11 @@
 C.CS=H.mm('vm')
 C.Hk=H.mm('Gk')
 C.hN=H.mm('oI')
-C.IWi=H.mm('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
+C.Qh=R.Zt.prototype
 C.ol=W.u9.prototype
-C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
+C.hi=H.VM(new W.hP(W.pq()),[W.OJ])
 $.libraries_to_load = {}
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
@@ -24543,6 +24634,7 @@
 $.nw=null
 $.vv=null
 $.Bv=null
+$.NR=null
 $.oK=null
 $.tY=null
 $.S6=null
@@ -24554,16 +24646,14 @@
 $.RL=!1
 $.Y4=C.IF
 $.xO=0
-$.NR=null
-$.tE=null
 $.el=0
 $.tW=null
 $.Td=!1
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["AZ","B2","BN","BT","BX","Ba","Bf","Bk","C","C0","C4","CL","Ch","D","D3","D6","Dd","De","Dy","E","Ec","F","FL","FV","Fr","G6","GB","GG","GT","HG","Hn","Hs","IW","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LV","LZ","M8","Md","Mi","Mq","Mu","NC","NZ","Ne","Nj","O","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qq","Qx","R3","R4","RB","RF","RP","RR","Rg","Rz","SF","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VI","VR","Vk","Vr","W","W3","W4","WL","WO","WZ","Wt","X6","XG","XL","XU","Xl","Y","Y9","YF","YU","YW","Z","Z1","Z2","ZB","ZL","Ze","Zv","aC","aN","aZ","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","f9","fk","fm","fz","g","gA","gAp","gAq","gAu","gAy","gB","gB1","gBA","gBW","gCO","gCY","gCd","gCj","gDD","gDt","gEh","gF0","gF8","gFR","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gGj","gHX","gHm","gHu","gI","gIF","gIt","gJ0","gJS","gJf","gJo","gJp","gKE","gKM","gKU","gKV","gLA","gLY","gLm","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNI","gNh","gNl","gO3","gO9","gOc","gOl","gP","gP1","gPe","gPj","gPu","gPw","gPy","gQ7","gQW","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUV","gUj","gUy","gUz","gV4","gVa","gVl","gW0","gWT","gX3","gXc","gXh","gXt","gZ8","gZC","gZf","ga4","gaK","gai","gbG","gbP","gbV","gbx","gcC","gcL","gdU","geJ","geT","geb","gey","gfN","gfY","gfb","gfc","ghU","ghf","ghm","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkc","gkf","gkp","gl0","gl7","glc","gm0","gm2","gmH","gmW","gmm","gng","gnv","gnx","goE","goc","gor","gpQ","gpo","gq3","gq6","gqO","gqY","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","guD","guw","gvH","gvL","gvR","gvc","gvt","gwd","gx8","gxX","gxj","gxr","gxw","gyH","gyT","gys","gz1","gzP","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","i","i4","iF","iM","ii","iw","j","jh","jp","jx","k0","kO","ka","l5","lj","m","mK","n","nB","nC","nH","ni","nq","nt","oB","oC","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qH","qZ","r4","r6","rJ","sAp","sAq","sAu","sAy","sB","sB1","sBA","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF8","sFR","sFw","sG1","sG3","sGQ","sGV","sGd","sGj","sHX","sHm","sHu","sIF","sIt","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLY","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNI","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUy","sUz","sV4","sVa","sWT","sX3","sXc","sXh","sXt","sZ8","sZC","sa4","saK","sai","sbG","sbP","sbV","scC","scL","sdU","seJ","seT","seb","sfN","sfY","sfb","sfc","shU","shf","shm","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skc","skf","skp","sl7","sm0","sm2","smH","sng","snv","snx","soE","soc","spQ","spo","sq3","sq6","sqO","sqY","srU","srZ","srs","st0","st5","stD","stN","stT","stY","suD","suw","svH","svL","svR","svt","swd","sxX","sxj","sxr","sxw","syH","syT","sys","sz1","szZ","szh","szj","szw","t","tZ","tg","tt","u","u8","uB","vD","w","wE","wH","wL","wR","wW","wY","wg","x3","xc","xe","xo","y0","yC","yF","yG","yM","yN","yc","ym","yn","yq","yu","yx","yy","z2","zV","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.I5,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.z5},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.Qw,E.Fv,{created:E.AH},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.v9},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.mR,A.fl,{created:A.Yt},C.JZ,X.E7,{created:X.jD},C.wd,Z.vj,{created:Z.mA},C.CTH,D.St,{created:D.JR},C.Rg,N.yb,{created:N.N0},C.cx5,D.m8,{created:D.Tt},C.l49,Z.uL,{created:Z.Hx},C.GG,L.PF,{created:L.A5},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.Xb,F.vc,{created:F.Fe},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.ow,F.E9,{created:F.TW},C.PV,A.wM,{created:A.lT},C.EP,K.NM,{created:K.op},C.FsU,A.vI,{created:A.ZC},C.Bm,A.XP,{created:A.XL},C.Tn,M.T2,{created:M.SP},C.hg,W.hd,{},C.dd,B.pR,{created:B.b4},C.Ud8,Z.Ps,{created:Z.zg},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.cY},C.IWi,X.Vu,{created:X.bV}]
+$.Dq=["AZ","B2","BN","BT","BX","Ba","Bf","Bk","C","C0","C4","CL","Ch","D","D3","D6","Dd","De","E","Ec","F","FL","FV","Fr","G6","GB","GG","GT","HG","Hn","Hs","IW","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LV","Md","Mi","Mu","NZ","Nj","O","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qq","Qx","R3","R4","RB","RF","RP","RR","Rg","Rz","SF","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VR","Vk","Vr","W","W3","W4","WL","WO","WZ","Wj","Wt","X6","XG","XL","XU","Xl","Y","Y9","YF","YU","YW","Yh","Z","Z1","Z2","ZB","ZL","ZZ","Ze","Zv","aC","aN","aZ","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","f9","fk","fm","fz","g","gA","gAp","gAq","gAu","gAy","gB","gB1","gBW","gCO","gCY","gCd","gCj","gDD","gDt","gEh","gF0","gFR","gG0","gG1","gG3","gGQ","gGV","gGd","gGj","gHX","gHm","gHu","gI","gIF","gIt","gJ0","gJS","gJf","gJh","gJo","gJp","gKE","gKM","gKV","gLA","gLW","gLY","gLm","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOc","gOl","gP","gP1","gPe","gPj","gPu","gPy","gQ7","gQW","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gSS","gTB","gTq","gUQ","gUV","gUj","gUo","gUp","gUy","gUz","gVa","gVl","gW0","gWT","gX3","gXc","gXh","gXt","gZ8","gZC","gZf","ga4","gaK","gah","gai","gbG","gbP","gbV","gbx","gcC","gcL","gdU","geH","geJ","geT","geb","gey","gfN","gfY","gfb","gfc","ghU","ghf","gi9","giC","giO","gig","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkX","gkc","gkf","gkg","gkp","gl0","gl7","gm0","gm2","gmH","gmW","gmm","gn9","gng","gnv","gnx","goE","goc","gor","gpC","gpD","gpQ","gpo","gq3","gq6","gqO","gqY","gqn","grK","grU","grZ","grp","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","guD","guw","guy","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxH","gxX","gxj","gxr","gxw","gyH","gyT","gys","gz1","gzP","gzZ","gzf","gzh","gzj","gzw","h","h8","hZ","hc","hr","i","i4","iF","iM","ii","iw","j","jh","jp","jx","k","k0","kO","ka","l5","lj","m","mK","n","nB","nC","nH","ni","np","nq","nt","oB","oC","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qH","qZ","r6","rJ","sAp","sAq","sAu","sAy","sB","sB1","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sFR","sG1","sG3","sGQ","sGV","sGd","sGj","sHX","sHm","sHu","sIF","sIt","sJ0","sJS","sJh","sJo","sKM","sKV","sLA","sLW","sLY","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPe","sPj","sPu","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sSS","sTB","sTq","sUQ","sUo","sUp","sUy","sUz","sVa","sWT","sX3","sXc","sXh","sXt","sZ8","sZC","sa4","saK","sah","sai","sbG","sbP","sbV","scC","scL","sdU","seH","seJ","seT","seb","sfN","sfY","sfb","sfc","shU","shf","siC","sig","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skX","skc","skf","skg","skp","sl7","sm0","sm2","smH","sn9","sng","snv","snx","soE","soc","spC","spD","spQ","spo","sq3","sq6","sqO","sqY","srU","srZ","srs","st0","st5","stD","stN","stT","stY","suD","suw","suy","svH","svL","svk","svt","swd","sxH","sxX","sxj","sxr","sxw","syH","syT","sys","sz1","szZ","szf","szh","szj","szw","t","tZ","tg","tt","u","u8","uB","uW","w","wE","wH","wL","wR","wW","wY","wg","x3","xc","xe","xo","y0","yC","yF","yM","yN","yc","yn","yq","yu","yx","yy","z2","zV","zr"]
+$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.I5,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.Lz,S.PO,{created:S.O5},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.Qw,E.Fv,{created:E.AH},C.G4,O.CN,{created:O.On},C.Mh,R.Zt,{created:R.xip},C.Lf0,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.wH},C.yiu,A.knI,{created:A.Th},C.oW,A.Ya5,{created:A.EL},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.mR,A.fl,{created:A.Yt},C.JZ,X.E7,{created:X.jD},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.Rg,N.yb,{created:N.N0},C.wHJ,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.Tt},C.l49,Z.uL,{created:Z.Hx},C.GG,L.PF,{created:L.A5},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.yD,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.vA,A.tz,{created:A.J8},C.ow,F.E9,{created:F.TW},C.PV,A.wM,{created:A.lT},C.EP,K.NM,{created:K.op},C.Bm,A.XP,{created:A.XL},C.Tn,M.T2,{created:M.SP},C.hg,W.hd,{},C.dd,B.pR,{created:B.b4},C.Ud8,Z.Ps,{created:Z.zg},C.Io,F.HT,{created:F.Fe},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.cY}]
 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})
@@ -24606,6 +24696,9 @@
     return e.message;
   }
 }())})
+I.$lazy($,"_codeMatcher","rC","Ks",function(){return new H.VR(H.v4("/code/",!1,!0,!1),null,null)})
+I.$lazy($,"_scriptMatcher","lF","hK",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
+I.$lazy($,"currentIsolateMatcher","qY","oy",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($,"validationPattern","zP","R0",function(){return new H.VR(H.v4("^(?:[a-zA-Z$][a-zA-Z$0-9_]*\\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|-|unary-|\\[\\]=|~|==|\\[\\]|\\*|/|%|~/|\\+|<<|>>|>=|>|<=|<|&|\\^|\\|)$",!1,!0,!1),null,null)})
@@ -24625,15 +24718,9 @@
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_loggers","DY","U0",function(){return H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,N.TJ])})
-I.$lazy($,"currentIsolateMatcher","qY","oy",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"currentIsolateProfileMatcher","HT","wf",function(){return new H.VR(H.v4("#/isolates/\\d+/profile",!1,!0,!1),null,null)})
-I.$lazy($,"_codeMatcher","zS","mE",function(){return new H.VR(H.v4("/isolates/\\d+/code/",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","yA","kj",function(){return new H.VR(H.v4("/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_scriptMatcher","c6","Ww",function(){return new H.VR(H.v4("/isolates/\\d+/scripts/.+",!1,!0,!1),null,null)})
-I.$lazy($,"_scriptPrefixMatcher","ZW","XJ",function(){return new H.VR(H.v4("/isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().call$0()})
+I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.YJ().call$0()})
 I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
@@ -24642,7 +24729,7 @@
 I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
 I.$lazy($,"_objectType","Cy","Tf",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w9().call$0()})
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w10().call$0()})
 I.$lazy($,"bindPattern","ZA","VC",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
 z.FV(0,C.va)
@@ -24660,16 +24747,16 @@
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
 I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().call$0()})
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.lP(),"-",new K.Uf(),"*",new K.Ra(),"/",new K.wJY(),"==",new K.zOQ(),"!=",new K.W6o(),">",new K.MdQ(),">=",new K.YJG(),"<",new K.DOe(),"<=",new K.lPa(),"||",new K.Ufa(),"&&",new K.Raa(),"|",new K.w0()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w4(),"-",new K.w5(),"!",new K.w7()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJ().call$0()})
+I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.Uf(),"-",new K.Ra(),"*",new K.wJY(),"/",new K.zOQ(),"==",new K.W6o(),"!=",new K.MdQ(),">",new K.YJG(),">=",new K.DOe(),"<",new K.lPa(),"<=",new K.Ufa(),"||",new K.Raa(),"&&",new K.w0(),"|",new K.w4()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w5(),"-",new K.w7(),"!",new K.w9()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().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])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.DO()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.lP()).zV(0,", ")})
 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","sender","e","msg","message","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:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","compare","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",!1,"futures","eagerError","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Vx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.e4,P.JB,null,P.MN]},"self","parent",{func:"aD",args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"zo",ret:P.lO,args:[P.JB,P.e4,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.e4,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.e4,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"Re",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","sb",{func:"xh",ret:J.im,args:[P.Tx,P.Tx]},"formattedString",{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}},"host","scheme","query","queryParameters","fragment","component","val","val1","val2",C.xM,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","onProgress","withCredentials","method","mimeType","requestHeaders","responseType","sendData","thing","win","constructor",{func:"Dv",args:[null]},{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total","_","id","members",{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","args","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.cX,K.Ae],args:[P.cX]},"classMirror","c","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","n","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","password","user","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","attributeFilter","attributeOldValue","attributes","characterData","characterDataOldValue","childList","subtree","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","collection","","separator",0,!0,"growable","fractionDigits","str","authentification","resume","portId","port","dataEvent","info",{func:"bh",args:[null,null]},"parameter","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",P.Z0,L.mL,[P.Z0,J.O,W.cv],{func:"qo",ret:P.Z0},C.nJ,C.Us,{func:"Hw",args:[P.Z0]},"done",B.Vf,H.Tp,"trace",J.kn,L.bv,Q.xI,Z.pv,L.kx,{func:"bR",ret:L.kx},{func:"oX",args:[L.kx]},{func:"I0",ret:J.O},F.Vfx,J.O,C.mI,{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.Nr,"action","test","library",{func:"h0",args:[H.Uz]},{func:"rm",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]},"theError","theStackTrace",{func:"rf",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","event","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:"Q5",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]},"digit",{func:"an",ret:J.im,args:[J.im]},"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",L.DP,{func:"JA",ret:L.DP},{func:"Qs",args:[L.DP]},E.tuj,F.Vct,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:"pw",void:true,args:[J.kn,null]},"expand",Z.cda,Z.uL,J.im,[J.Q,L.Y2],[J.Q,J.O],"codeCaller",{func:"UO",args:[L.Vi]},J.Q,L.XN,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},{func:"mR",args:[J.Q]},{func:"ub",void:true,args:[L.bv,J.im,P.Z0]},"totalSamples",{func:"F9",void:true,args:[L.bv]},{func:"bN",ret:J.O,args:[L.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.waa,"profile",{func:"Wy",ret:L.bv},{func:"Gt",args:[L.bv]},D.V0,Z.V4,M.V10,"logLevel","rec",{func:"IM",args:[N.HV]},{func:"cr",ret:[J.Q,P.Z0]},A.V11,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,L.dZ,L.Nu,L.yU,"label",[P.Z0,J.O,L.rj],[J.Q,L.kx],[P.Z0,J.O,J.GW],{func:"Ik",ret:L.CM},{func:"Ve",args:[L.CM]},"address","coverages","timer",[P.Z0,J.O,L.bv],"E",{func:"EU",ret:P.iD},{func:"Y4",args:[P.iD]},{func:"zs",ret:J.O,args:[J.O]},"scriptURL",{func:"jN",ret:J.O,args:[J.O,J.O]},"isolateId",{func:"fP",ret:J.GW},{func:"mV",args:[J.GW]},[J.Q,L.DP],"calls","codes","instructionList","profileCode",{func:"VL",args:[L.kx,L.kx]},[J.Q,L.c2],{func:"dt",ret:P.cX},"lineNumber","hits",{func:"ZD",args:[[J.Q,P.Z0]]},"responseString","requestString",{func:"Tz",void:true,args:[null,null]},"children","rowIndex",V.V18,{func:"AG",void:true,args:[J.O,J.O,J.O]},{func:"ru",ret:L.mL},{func:"pu",args:[L.mL]},{func:"nxg",ret:J.O,args:[J.GW]},"time","bytes",{func:"kX",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},Z.LP,{func:"Aa",args:[P.e4,P.JB]},{func:"TB",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"S5",ret:J.kn,args:[P.a]},{func:"D8",args:[[J.Q,G.DA]]},{func:"Gm",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rj",void:true,args:[J.O,J.O]},"preventCascade",{func:"KT",void:true,args:[[P.cX,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:"Nt",args:[U.hw]},A.T5,L.rj,{func:"LW",ret:L.rj},{func:"PF",args:[L.rj]},{func:"Yg",ret:J.O,args:[L.c2]},U.V19,"coverage","link",Q.Ds,K.V20,X.V21,"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]]},];$=null
+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","sender","e","msg","message","x","record","value","memberName",{func:"pd",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]},"_","objectId","id","members",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","compare","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",!1,"futures","eagerError","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Vx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.e4,P.JB,null,P.MN]},"self","parent",{func:"aD",args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"xN",ret:P.lO,args:[P.JB,P.e4,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.e4,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.e4,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"Re",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","sb","lead","tail",{func:"P2",ret:J.im,args:[P.Rz,P.Rz]},"formattedString",{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}},"host","scheme","query","queryParameters","fragment","component","val","val1","val2",C.xM,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","onProgress","withCredentials","method","mimeType","requestHeaders","responseType","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","args","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.cX,K.Ae],args:[P.cX]},"classMirror","c","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","n","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","password","user","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","attributeFilter","attributeOldValue","attributes","characterData","characterDataOldValue","childList","subtree","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","collection","","separator",0,!0,"growable","fractionDigits","str","authentification","resume","portId","port","dataEvent","info",{func:"bh",args:[null,null]},"parameter","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,G.No,{func:"qo",ret:P.Z0},C.nJ,C.mI,{func:"Hw",args:[P.Z0]},{func:"Wy",ret:G.bv},{func:"Gt",args:[G.bv]},"ResponseError","errorType","label","row",[P.Z0,J.O,G.rj],[J.Q,G.kx],[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},{func:"NA",ret:G.CM},{func:"Ve",args:[G.CM]},{func:"I0",ret:J.O},{func:"cH",ret:J.im},{func:"Z5",args:[J.im]},"address","coverages","modelName",{func:"Tz",void:true,args:[null,null]},"st","timer","response",{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},{func:"EU",ret:P.iD},{func:"Y4",args:[P.iD]},"event","so",J.im,J.O,{func:"fP",ret:J.GW},{func:"Ku",args:[J.GW]},[J.Q,G.Q4],"calls","codes","instructionList","profileCode",{func:"VL",args:[G.kx,G.kx]},[J.Q,G.c2],C.Us,{func:"dt",ret:P.cX},"lineNumber","hits",{func:"cM",void:true,args:[P.Z0]},"k",[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",V.qC,{func:"ru",ret:G.mL},"E",P.Z0,G.bv,[P.Z0,J.O,W.cv],"done",B.Ur,H.Tp,"trace",J.kn,Q.xI,Z.KU,G.kx,{func:"bR",ret:G.kx},{func:"VI",args:[G.kx]},F.qbd,"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Ds,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"rm",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:"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]},"theError","theStackTrace",{func:"rf",args:[P.a]},{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","elements","offset","comp","key1","key2",{func:"Q5",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:"hs",ret:J.kn,args:[J.im]},"digit",{func:"an",ret:J.im,args:[J.im]},"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",G.Q4,{func:"JA",ret:G.Q4},{func:"Qs",args:[G.Q4]},E.pv,F.Vfx,A.Urj,N.oub,{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.c4r,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.Squ,S.Vf,R.Zt,"codeCaller",{func:"SR",args:[G.Vi]},J.Q,G.XN,{func:"r5",ret:J.Q},{func:"mR",args:[J.Q]},{func:"ub",void:true,args:[G.bv,J.im,P.Z0]},"totalSamples",{func:"F9",void:true,args:[G.bv]},{func:"bN",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.KUl,"profile",S.PO,Z.tuj,M.mHk,"logLevel","rec",{func:"IM",args:[N.HV]},G.mL,{func:"pu",args:[G.mL]},L.Vct,Z.uL,A.D13,A.WZq,A.pva,A.cda,A.qFb,A.rna,A.Vba,V.waa,{func:"wA",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"pT",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.JB]},{func:"Zg",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"S5",ret:J.kn,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"D8",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rj",void:true,args:[J.O,J.O]},"preventCascade",{func:"KT",void:true,args:[[P.cX,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:"mM",args:[U.hw]},Q.V0,A.T5,G.rj,{func:"ls",ret:G.rj},{func:"PF",args:[G.rj]},{func:"Yg",ret:J.O,args:[G.c2]},U.oaa,"coverage",Q.Sq,K.q2,X.q3,"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:"Lr",ret:G.No},{func:"AfY",args:[G.No]},R.Dsd,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -24868,11 +24955,11 @@
 $desc=$collectedClasses.qE
 if($desc instanceof Array)$desc=$desc[1]
 qE.prototype=$desc
-function ho(){}ho.builtin$cls="ho"
-if(!"name" in ho)ho.name="ho"
-$desc=$collectedClasses.ho
+function pa(){}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
 if($desc instanceof Array)$desc=$desc[1]
-ho.prototype=$desc
+pa.prototype=$desc
 function Gh(){}Gh.builtin$cls="Gh"
 if(!"name" in Gh)Gh.name="Gh"
 $desc=$collectedClasses.Gh
@@ -24971,12 +25058,12 @@
 Zv.prototype=$desc
 Zv.prototype.gRn=function(receiver){return receiver.data}
 Zv.prototype.gB=function(receiver){return receiver.length}
-function QQS(){}QQS.builtin$cls="QQS"
-if(!"name" in QQS)QQS.name="QQS"
-$desc=$collectedClasses.QQS
+function Yr(){}Yr.builtin$cls="Yr"
+if(!"name" in Yr)Yr.name="Yr"
+$desc=$collectedClasses.Yr
 if($desc instanceof Array)$desc=$desc[1]
-QQS.prototype=$desc
-QQS.prototype.gtT=function(receiver){return receiver.code}
+Yr.prototype=$desc
+Yr.prototype.gtT=function(receiver){return receiver.code}
 function BR(){}BR.builtin$cls="BR"
 if(!"name" in BR)BR.name="BR"
 $desc=$collectedClasses.BR
@@ -25075,7 +25162,6 @@
 cv.prototype.gxr=function(receiver){return receiver.className}
 cv.prototype.sxr=function(receiver,v){return receiver.className=v}
 cv.prototype.gjO=function(receiver){return receiver.id}
-cv.prototype.sjO=function(receiver,v){return receiver.id=v}
 function Fs(){}Fs.builtin$cls="Fs"
 if(!"name" in Fs)Fs.name="Fs"
 $desc=$collectedClasses.Fs
@@ -25132,16 +25218,16 @@
 $desc=$collectedClasses.u5
 if($desc instanceof Array)$desc=$desc[1]
 u5.prototype=$desc
-function h4(){}h4.builtin$cls="h4"
-if(!"name" in h4)h4.name="h4"
-$desc=$collectedClasses.h4
+function Tq(){}Tq.builtin$cls="Tq"
+if(!"name" in Tq)Tq.name="Tq"
+$desc=$collectedClasses.Tq
 if($desc instanceof Array)$desc=$desc[1]
-h4.prototype=$desc
-h4.prototype.gB=function(receiver){return receiver.length}
-h4.prototype.gbP=function(receiver){return receiver.method}
-h4.prototype.goc=function(receiver){return receiver.name}
-h4.prototype.soc=function(receiver,v){return receiver.name=v}
-h4.prototype.gN=function(receiver){return receiver.target}
+Tq.prototype=$desc
+Tq.prototype.gB=function(receiver){return receiver.length}
+Tq.prototype.gbP=function(receiver){return receiver.method}
+Tq.prototype.goc=function(receiver){return receiver.name}
+Tq.prototype.soc=function(receiver,v){return receiver.name=v}
+Tq.prototype.gN=function(receiver){return receiver.target}
 function W4(){}W4.builtin$cls="W4"
 if(!"name" in W4)W4.name="W4"
 $desc=$collectedClasses.W4
@@ -25152,11 +25238,11 @@
 $desc=$collectedClasses.jP
 if($desc instanceof Array)$desc=$desc[1]
 jP.prototype=$desc
-function Hd(){}Hd.builtin$cls="Hd"
-if(!"name" in Hd)Hd.name="Hd"
-$desc=$collectedClasses.Hd
+function Cz(){}Cz.builtin$cls="Cz"
+if(!"name" in Cz)Cz.name="Cz"
+$desc=$collectedClasses.Cz
 if($desc instanceof Array)$desc=$desc[1]
-Hd.prototype=$desc
+Cz.prototype=$desc
 function tA(){}tA.builtin$cls="tA"
 if(!"name" in tA)tA.name="tA"
 $desc=$collectedClasses.tA
@@ -25349,11 +25435,11 @@
 $desc=$collectedClasses.ZY
 if($desc instanceof Array)$desc=$desc[1]
 ZY.prototype=$desc
-function DD(){}DD.builtin$cls="DD"
-if(!"name" in DD)DD.name="DD"
-$desc=$collectedClasses.DD
+function Hy(){}Hy.builtin$cls="Hy"
+if(!"name" in Hy)Hy.name="Hy"
+$desc=$collectedClasses.Hy
 if($desc instanceof Array)$desc=$desc[1]
-DD.prototype=$desc
+Hy.prototype=$desc
 function EeC(){}EeC.builtin$cls="EeC"
 if(!"name" in EeC)EeC.name="EeC"
 $desc=$collectedClasses.EeC
@@ -25369,11 +25455,11 @@
 Qb.prototype=$desc
 Qb.prototype.gP=function(receiver){return receiver.value}
 Qb.prototype.sP=function(receiver,v){return receiver.value=v}
-function PG(){}PG.builtin$cls="PG"
-if(!"name" in PG)PG.name="PG"
-$desc=$collectedClasses.PG
+function Vu(){}Vu.builtin$cls="Vu"
+if(!"name" in Vu)Vu.name="Vu"
+$desc=$collectedClasses.Vu
 if($desc instanceof Array)$desc=$desc[1]
-PG.prototype=$desc
+Vu.prototype=$desc
 function xe(){}xe.builtin$cls="xe"
 if(!"name" in xe)xe.name="xe"
 $desc=$collectedClasses.xe
@@ -25403,24 +25489,24 @@
 $desc=$collectedClasses.Ve
 if($desc instanceof Array)$desc=$desc[1]
 Ve.prototype=$desc
-function Oq(){}Oq.builtin$cls="Oq"
-if(!"name" in Oq)Oq.name="Oq"
-$desc=$collectedClasses.Oq
+function CX(){}CX.builtin$cls="CX"
+if(!"name" in CX)CX.name="CX"
+$desc=$collectedClasses.CX
 if($desc instanceof Array)$desc=$desc[1]
-Oq.prototype=$desc
+CX.prototype=$desc
 function H9(){}H9.builtin$cls="H9"
 if(!"name" in H9)H9.name="H9"
 $desc=$collectedClasses.H9
 if($desc instanceof Array)$desc=$desc[1]
 H9.prototype=$desc
-function o4(){}o4.builtin$cls="o4"
-if(!"name" in o4)o4.name="o4"
-$desc=$collectedClasses.o4
+function FI(){}FI.builtin$cls="FI"
+if(!"name" in FI)FI.name="FI"
+$desc=$collectedClasses.FI
 if($desc instanceof Array)$desc=$desc[1]
-o4.prototype=$desc
-o4.prototype.gjL=function(receiver){return receiver.oldValue}
-o4.prototype.gN=function(receiver){return receiver.target}
-o4.prototype.gt5=function(receiver){return receiver.type}
+FI.prototype=$desc
+FI.prototype.gjL=function(receiver){return receiver.oldValue}
+FI.prototype.gN=function(receiver){return receiver.target}
+FI.prototype.gt5=function(receiver){return receiver.type}
 function oU(){}oU.builtin$cls="oU"
 if(!"name" in oU)oU.name="oU"
 $desc=$collectedClasses.oU
@@ -25635,13 +25721,13 @@
 $desc=$collectedClasses.uaa
 if($desc instanceof Array)$desc=$desc[1]
 uaa.prototype=$desc
-function zD9(){}zD9.builtin$cls="zD9"
-if(!"name" in zD9)zD9.name="zD9"
-$desc=$collectedClasses.zD9
+function Hd(){}Hd.builtin$cls="Hd"
+if(!"name" in Hd)Hd.name="Hd"
+$desc=$collectedClasses.Hd
 if($desc instanceof Array)$desc=$desc[1]
-zD9.prototype=$desc
-zD9.prototype.gkc=function(receiver){return receiver.error}
-zD9.prototype.gG1=function(receiver){return receiver.message}
+Hd.prototype=$desc
+Hd.prototype.gkc=function(receiver){return receiver.error}
+Hd.prototype.gG1=function(receiver){return receiver.message}
 function Ul(){}Ul.builtin$cls="Ul"
 if(!"name" in Ul)Ul.name="Ul"
 $desc=$collectedClasses.Ul
@@ -25694,11 +25780,11 @@
 $desc=$collectedClasses.tV
 if($desc instanceof Array)$desc=$desc[1]
 tV.prototype=$desc
-function BT(){}BT.builtin$cls="BT"
-if(!"name" in BT)BT.name="BT"
-$desc=$collectedClasses.BT
+function KP(){}KP.builtin$cls="KP"
+if(!"name" in KP)KP.name="KP"
+$desc=$collectedClasses.KP
 if($desc instanceof Array)$desc=$desc[1]
-BT.prototype=$desc
+KP.prototype=$desc
 function yY(){}yY.builtin$cls="yY"
 if(!"name" in yY)yY.name="yY"
 $desc=$collectedClasses.yY
@@ -25757,11 +25843,11 @@
 $desc=$collectedClasses.OJ
 if($desc instanceof Array)$desc=$desc[1]
 OJ.prototype=$desc
-function Mf(){}Mf.builtin$cls="Mf"
-if(!"name" in Mf)Mf.name="Mf"
-$desc=$collectedClasses.Mf
+function Qa(){}Qa.builtin$cls="Qa"
+if(!"name" in Qa)Qa.name="Qa"
+$desc=$collectedClasses.Qa
 if($desc instanceof Array)$desc=$desc[1]
-Mf.prototype=$desc
+Qa.prototype=$desc
 function dp(){}dp.builtin$cls="dp"
 if(!"name" in dp)dp.name="dp"
 $desc=$collectedClasses.dp
@@ -25777,11 +25863,11 @@
 $desc=$collectedClasses.aG
 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
+function J6(){}J6.builtin$cls="J6"
+if(!"name" in J6)J6.name="J6"
+$desc=$collectedClasses.J6
 if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+J6.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -25906,11 +25992,11 @@
 $desc=$collectedClasses.jQ
 if($desc instanceof Array)$desc=$desc[1]
 jQ.prototype=$desc
-function Kg(){}Kg.builtin$cls="Kg"
-if(!"name" in Kg)Kg.name="Kg"
-$desc=$collectedClasses.Kg
+function mT(){}mT.builtin$cls="mT"
+if(!"name" in mT)mT.name="mT"
+$desc=$collectedClasses.mT
 if($desc instanceof Array)$desc=$desc[1]
-Kg.prototype=$desc
+mT.prototype=$desc
 function ui(){}ui.builtin$cls="ui"
 if(!"name" in ui)ui.name="ui"
 $desc=$collectedClasses.ui
@@ -25974,11 +26060,11 @@
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
-function kK(){}kK.builtin$cls="kK"
-if(!"name" in kK)kK.name="kK"
-$desc=$collectedClasses.kK
+function wf(){}wf.builtin$cls="wf"
+if(!"name" in wf)wf.name="wf"
+$desc=$collectedClasses.wf
 if($desc instanceof Array)$desc=$desc[1]
-kK.prototype=$desc
+wf.prototype=$desc
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -25989,11 +26075,11 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
-function NdT(){}NdT.builtin$cls="NdT"
-if(!"name" in NdT)NdT.name="NdT"
-$desc=$collectedClasses.NdT
+function Ic(){}Ic.builtin$cls="Ic"
+if(!"name" in Ic)Ic.name="Ic"
+$desc=$collectedClasses.Ic
 if($desc instanceof Array)$desc=$desc[1]
-NdT.prototype=$desc
+Ic.prototype=$desc
 function lc(){}lc.builtin$cls="lc"
 if(!"name" in lc)lc.name="lc"
 $desc=$collectedClasses.lc
@@ -26041,26 +26127,26 @@
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
-function ca(){}ca.builtin$cls="ca"
-if(!"name" in ca)ca.name="ca"
-$desc=$collectedClasses.ca
+function Ub(){}Ub.builtin$cls="Ub"
+if(!"name" in Ub)Ub.name="Ub"
+$desc=$collectedClasses.Ub
 if($desc instanceof Array)$desc=$desc[1]
-ca.prototype=$desc
-function um(){}um.builtin$cls="um"
-if(!"name" in um)um.name="um"
-$desc=$collectedClasses.um
+Ub.prototype=$desc
+function kK(){}kK.builtin$cls="kK"
+if(!"name" in kK)kK.name="kK"
+$desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
-um.prototype=$desc
+kK.prototype=$desc
 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
-function kL(){}kL.builtin$cls="kL"
-if(!"name" in kL)kL.name="kL"
-$desc=$collectedClasses.kL
+function um(){}um.builtin$cls="um"
+if(!"name" in um)um.name="um"
+$desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
-kL.prototype=$desc
+um.prototype=$desc
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
@@ -26140,11 +26226,11 @@
 $desc=$collectedClasses.XE
 if($desc instanceof Array)$desc=$desc[1]
 XE.prototype=$desc
-function GH(){}GH.builtin$cls="GH"
-if(!"name" in GH)GH.name="GH"
-$desc=$collectedClasses.GH
+function mO(){}mO.builtin$cls="mO"
+if(!"name" in mO)mO.name="mO"
+$desc=$collectedClasses.mO
 if($desc instanceof Array)$desc=$desc[1]
-GH.prototype=$desc
+mO.prototype=$desc
 function lo(){}lo.builtin$cls="lo"
 if(!"name" in lo)lo.name="lo"
 $desc=$collectedClasses.lo
@@ -26155,14 +26241,14 @@
 $desc=$collectedClasses.NJ
 if($desc instanceof Array)$desc=$desc[1]
 NJ.prototype=$desc
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function j24(){}j24.builtin$cls="j24"
+if(!"name" in j24)j24.name="j24"
+$desc=$collectedClasses.j24
 if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
-nd.prototype.gt5=function(receiver){return receiver.type}
-nd.prototype.st5=function(receiver,v){return receiver.type=v}
-nd.prototype.gmH=function(receiver){return receiver.href}
+j24.prototype=$desc
+j24.prototype.gt5=function(receiver){return receiver.type}
+j24.prototype.st5=function(receiver,v){return receiver.type=v}
+j24.prototype.gmH=function(receiver){return receiver.href}
 function vt(){}vt.builtin$cls="vt"
 if(!"name" in vt)vt.name="vt"
 $desc=$collectedClasses.vt
@@ -26289,11 +26375,11 @@
 $desc=$collectedClasses.cB
 if($desc instanceof Array)$desc=$desc[1]
 cB.prototype=$desc
-function Mh(){}Mh.builtin$cls="Mh"
-if(!"name" in Mh)Mh.name="Mh"
-$desc=$collectedClasses.Mh
+function uY(){}uY.builtin$cls="uY"
+if(!"name" in uY)uY.name="uY"
+$desc=$collectedClasses.uY
 if($desc instanceof Array)$desc=$desc[1]
-Mh.prototype=$desc
+uY.prototype=$desc
 function yR(){}yR.builtin$cls="yR"
 if(!"name" in yR)yR.name="yR"
 $desc=$collectedClasses.yR
@@ -26339,11 +26425,11 @@
 $desc=$collectedClasses.xt
 if($desc instanceof Array)$desc=$desc[1]
 xt.prototype=$desc
-function wx(){}wx.builtin$cls="wx"
-if(!"name" in wx)wx.name="wx"
-$desc=$collectedClasses.wx
+function VJ(){}VJ.builtin$cls="VJ"
+if(!"name" in VJ)VJ.name="VJ"
+$desc=$collectedClasses.VJ
 if($desc instanceof Array)$desc=$desc[1]
-wx.prototype=$desc
+VJ.prototype=$desc
 function P0(){}P0.builtin$cls="P0"
 if(!"name" in P0)P0.name="P0"
 $desc=$collectedClasses.P0
@@ -26376,11 +26462,11 @@
 $desc=$collectedClasses.WZ
 if($desc instanceof Array)$desc=$desc[1]
 WZ.prototype=$desc
-function rn(){}rn.builtin$cls="rn"
-if(!"name" in rn)rn.name="rn"
-$desc=$collectedClasses.rn
+function pF(){}pF.builtin$cls="pF"
+if(!"name" in pF)pF.name="pF"
+$desc=$collectedClasses.pF
 if($desc instanceof Array)$desc=$desc[1]
-rn.prototype=$desc
+pF.prototype=$desc
 function df(){}df.builtin$cls="df"
 if(!"name" in df)df.name="df"
 $desc=$collectedClasses.df
@@ -26507,11 +26593,11 @@
 $desc=$collectedClasses.vT
 if($desc instanceof Array)$desc=$desc[1]
 vT.prototype=$desc
-function VP(){}VP.builtin$cls="VP"
-if(!"name" in VP)VP.name="VP"
-$desc=$collectedClasses.VP
+function qa(){}qa.builtin$cls="qa"
+if(!"name" in qa)qa.name="qa"
+$desc=$collectedClasses.qa
 if($desc instanceof Array)$desc=$desc[1]
-VP.prototype=$desc
+qa.prototype=$desc
 function BQ(){}BQ.builtin$cls="BQ"
 if(!"name" in BQ)BQ.name="BQ"
 $desc=$collectedClasses.BQ
@@ -26682,11 +26768,11 @@
 $desc=$collectedClasses.OW
 if($desc instanceof Array)$desc=$desc[1]
 OW.prototype=$desc
-function hz(){}hz.builtin$cls="hz"
-if(!"name" in hz)hz.name="hz"
-$desc=$collectedClasses.hz
+function Dd(){}Dd.builtin$cls="Dd"
+if(!"name" in Dd)Dd.name="Dd"
+$desc=$collectedClasses.Dd
 if($desc instanceof Array)$desc=$desc[1]
-hz.prototype=$desc
+Dd.prototype=$desc
 function AP(){}AP.builtin$cls="AP"
 if(!"name" in AP)AP.name="AP"
 $desc=$collectedClasses.AP
@@ -26801,7 +26887,6 @@
 $desc=$collectedClasses.F3
 if($desc instanceof Array)$desc=$desc[1]
 F3.prototype=$desc
-F3.prototype.se0=function(v){return this.e0=v}
 function FD(mr,Rn,XZ,Rv,hG,Mo,AM){this.mr=mr
 this.Rn=Rn
 this.XZ=XZ
@@ -27054,10 +27139,346 @@
 $desc=$collectedClasses.tQ
 if($desc instanceof Array)$desc=$desc[1]
 tQ.prototype=$desc
-function G6(BW,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
+function mL(Z6,zf,AJ,Eb,AP,fn){this.Z6=Z6
+this.zf=zf
+this.AJ=AJ
+this.Eb=Eb
+this.AP=AP
+this.fn=fn}mL.builtin$cls="mL"
+if(!"name" in mL)mL.name="mL"
+$desc=$collectedClasses.mL
+if($desc instanceof Array)$desc=$desc[1]
+mL.prototype=$desc
+mL.prototype.gZ6=function(){return this.Z6}
+mL.prototype.gZ6.$reflectable=1
+mL.prototype.gzf=function(receiver){return this.zf}
+mL.prototype.gzf.$reflectable=1
+function Kf(Yb){this.Yb=Yb}Kf.builtin$cls="Kf"
+if(!"name" in Kf)Kf.name="Kf"
+$desc=$collectedClasses.Kf
+if($desc instanceof Array)$desc=$desc[1]
+Kf.prototype=$desc
+Kf.prototype.gYb=function(){return this.Yb}
+function qu(vR,bG){this.vR=vR
+this.bG=bG}qu.builtin$cls="qu"
+if(!"name" in qu)qu.name="qu"
+$desc=$collectedClasses.qu
+if($desc instanceof Array)$desc=$desc[1]
+qu.prototype=$desc
+qu.prototype.gbG=function(receiver){return this.bG}
+function bv(zf,rI,we,jF,XR,Z0,hI,am,y6,c8,LE,qU,yg,YG,jy,AP,fn){this.zf=zf
+this.rI=rI
+this.we=we
+this.jF=jF
+this.XR=XR
+this.Z0=Z0
+this.hI=hI
+this.am=am
+this.y6=y6
+this.c8=c8
+this.LE=LE
+this.qU=qU
+this.yg=yg
+this.YG=YG
+this.jy=jy
+this.AP=AP
+this.fn=fn}bv.builtin$cls="bv"
+if(!"name" in bv)bv.name="bv"
+$desc=$collectedClasses.bv
+if($desc instanceof Array)$desc=$desc[1]
+bv.prototype=$desc
+bv.prototype.gzf=function(receiver){return this.zf}
+bv.prototype.gXR=function(){return this.XR}
+bv.prototype.gXR.$reflectable=1
+bv.prototype.gZ0=function(){return this.Z0}
+bv.prototype.gZ0.$reflectable=1
+bv.prototype.gLE=function(){return this.LE}
+bv.prototype.gLE.$reflectable=1
+function eS(a){this.a=a}eS.builtin$cls="eS"
+if(!"name" in eS)eS.name="eS"
+$desc=$collectedClasses.eS
+if($desc instanceof Array)$desc=$desc[1]
+eS.prototype=$desc
+function IQ(b){this.b=b}IQ.builtin$cls="IQ"
+if(!"name" in IQ)IQ.name="IQ"
+$desc=$collectedClasses.IQ
+if($desc instanceof Array)$desc=$desc[1]
+IQ.prototype=$desc
+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 at(a,b){this.a=a
+this.b=b}at.builtin$cls="at"
+if(!"name" in at)at.name="at"
+$desc=$collectedClasses.at
+if($desc instanceof Array)$desc=$desc[1]
+at.prototype=$desc
+function wu(a,b){this.a=a
+this.b=b}wu.builtin$cls="wu"
+if(!"name" in wu)wu.name="wu"
+$desc=$collectedClasses.wu
+if($desc instanceof Array)$desc=$desc[1]
+wu.prototype=$desc
+function Vc(c,d){this.c=c
+this.d=d}Vc.builtin$cls="Vc"
+if(!"name" in Vc)Vc.name="Vc"
+$desc=$collectedClasses.Vc
+if($desc instanceof Array)$desc=$desc[1]
+Vc.prototype=$desc
+function KQ(a,b){this.a=a
+this.b=b}KQ.builtin$cls="KQ"
+if(!"name" in KQ)KQ.name="KQ"
+$desc=$collectedClasses.KQ
+if($desc instanceof Array)$desc=$desc[1]
+KQ.prototype=$desc
+function dZ(ec,jF,JL,MU,AP,fn){this.ec=ec
+this.jF=jF
+this.JL=JL
+this.MU=MU
+this.AP=AP
+this.fn=fn}dZ.builtin$cls="dZ"
+if(!"name" in dZ)dZ.name="dZ"
+$desc=$collectedClasses.dZ
+if($desc instanceof Array)$desc=$desc[1]
+dZ.prototype=$desc
+dZ.prototype.sec=function(v){return this.ec=v}
+function Qe(a){this.a=a}Qe.builtin$cls="Qe"
+if(!"name" in Qe)Qe.name="Qe"
+$desc=$collectedClasses.Qe
+if($desc instanceof Array)$desc=$desc[1]
+Qe.prototype=$desc
+function GH(a){this.a=a}GH.builtin$cls="GH"
+if(!"name" in GH)GH.name="GH"
+$desc=$collectedClasses.GH
+if($desc instanceof Array)$desc=$desc[1]
+GH.prototype=$desc
+function Q4(Yu,m7,L4,NC,xb,AP,fn){this.Yu=Yu
+this.m7=m7
+this.L4=L4
+this.NC=NC
+this.xb=xb
+this.AP=AP
+this.fn=fn}Q4.builtin$cls="Q4"
+if(!"name" in Q4)Q4.name="Q4"
+$desc=$collectedClasses.Q4
+if($desc instanceof Array)$desc=$desc[1]
+Q4.prototype=$desc
+Q4.prototype.gYu=function(){return this.Yu}
+Q4.prototype.gYu.$reflectable=1
+Q4.prototype.gm7=function(){return this.m7}
+Q4.prototype.gm7.$reflectable=1
+Q4.prototype.gL4=function(){return this.L4}
+Q4.prototype.gL4.$reflectable=1
+function WAE(Zd){this.Zd=Zd}WAE.builtin$cls="WAE"
+if(!"name" in WAE)WAE.name="WAE"
+$desc=$collectedClasses.WAE
+if($desc instanceof Array)$desc=$desc[1]
+WAE.prototype=$desc
+function N8(Yu,pO,Iw){this.Yu=Yu
+this.pO=pO
+this.Iw=Iw}N8.builtin$cls="N8"
+if(!"name" in N8)N8.name="N8"
+$desc=$collectedClasses.N8
+if($desc instanceof Array)$desc=$desc[1]
+N8.prototype=$desc
+N8.prototype.gYu=function(){return this.Yu}
+function Vi(tT,Av){this.tT=tT
+this.Av=Av}Vi.builtin$cls="Vi"
+if(!"name" in Vi)Vi.name="Vi"
+$desc=$collectedClasses.Vi
+if($desc instanceof Array)$desc=$desc[1]
+Vi.prototype=$desc
+Vi.prototype.gtT=function(receiver){return this.tT}
+Vi.prototype.gAv=function(){return this.Av}
+function kx(fY,vg,Mb,a0,VS,hw,fF,Du,va,tQ,Ge,hI,HJ,AP,fn){this.fY=fY
+this.vg=vg
+this.Mb=Mb
+this.a0=a0
+this.VS=VS
+this.hw=hw
+this.fF=fF
+this.Du=Du
+this.va=va
+this.tQ=tQ
+this.Ge=Ge
+this.hI=hI
+this.HJ=HJ
+this.AP=AP
+this.fn=fn}kx.builtin$cls="kx"
+if(!"name" in kx)kx.name="kx"
+$desc=$collectedClasses.kx
+if($desc instanceof Array)$desc=$desc[1]
+kx.prototype=$desc
+kx.prototype.gfY=function(receiver){return this.fY}
+kx.prototype.ga0=function(){return this.a0}
+kx.prototype.gVS=function(){return this.VS}
+kx.prototype.gfF=function(){return this.fF}
+kx.prototype.gDu=function(){return this.Du}
+kx.prototype.gva=function(){return this.va}
+kx.prototype.gva.$reflectable=1
+function fx(){}fx.builtin$cls="fx"
+if(!"name" in fx)fx.name="fx"
+$desc=$collectedClasses.fx
+if($desc instanceof Array)$desc=$desc[1]
+fx.prototype=$desc
+function CM(Aq,tm,hV){this.Aq=Aq
+this.tm=tm
+this.hV=hV}CM.builtin$cls="CM"
+if(!"name" in CM)CM.name="CM"
+$desc=$collectedClasses.CM
+if($desc instanceof Array)$desc=$desc[1]
+CM.prototype=$desc
+CM.prototype.gAq=function(receiver){return this.Aq}
+CM.prototype.ghV=function(){return this.hV}
+function xn(a){this.a=a}xn.builtin$cls="xn"
+if(!"name" in xn)xn.name="xn"
+$desc=$collectedClasses.xn
+if($desc instanceof Array)$desc=$desc[1]
+xn.prototype=$desc
+function vu(){}vu.builtin$cls="vu"
+if(!"name" in vu)vu.name="vu"
+$desc=$collectedClasses.vu
+if($desc instanceof Array)$desc=$desc[1]
+vu.prototype=$desc
+function c2(Rd,ye,i0,AP,fn){this.Rd=Rd
+this.ye=ye
+this.i0=i0
+this.AP=AP
+this.fn=fn}c2.builtin$cls="c2"
+if(!"name" in c2)c2.name="c2"
+$desc=$collectedClasses.c2
+if($desc instanceof Array)$desc=$desc[1]
+c2.prototype=$desc
+c2.prototype.gRd=function(receiver){return this.Rd}
+c2.prototype.gRd.$reflectable=1
+function rj(I2,VG,pw,tq,Sw,iA,AP,fn){this.I2=I2
+this.VG=VG
+this.pw=pw
+this.tq=tq
+this.Sw=Sw
+this.iA=iA
+this.AP=AP
+this.fn=fn}rj.builtin$cls="rj"
+if(!"name" in rj)rj.name="rj"
+$desc=$collectedClasses.rj
+if($desc instanceof Array)$desc=$desc[1]
+rj.prototype=$desc
+rj.prototype.gSw=function(){return this.Sw}
+rj.prototype.gSw.$reflectable=1
+function af(Aq){this.Aq=Aq}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.gAq=function(receiver){return this.Aq}
+function SI(YY,Aq,rI,we,R9,wv,V2,me){this.YY=YY
+this.Aq=Aq
+this.rI=rI
+this.we=we
+this.R9=R9
+this.wv=wv
+this.V2=V2
+this.me=me}SI.builtin$cls="SI"
+if(!"name" in SI)SI.name="SI"
+$desc=$collectedClasses.SI
+if($desc instanceof Array)$desc=$desc[1]
+SI.prototype=$desc
+function Y2(eT,yt,wd,oH){this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH}Y2.builtin$cls="Y2"
+if(!"name" in Y2)Y2.name="Y2"
+$desc=$collectedClasses.Y2
+if($desc instanceof Array)$desc=$desc[1]
+Y2.prototype=$desc
+Y2.prototype.geT=function(receiver){return this.eT}
+Y2.prototype.gyt=function(){return this.yt}
+Y2.prototype.gyt.$reflectable=1
+Y2.prototype.gwd=function(receiver){return this.wd}
+Y2.prototype.gwd.$reflectable=1
+Y2.prototype.goH=function(){return this.oH}
+Y2.prototype.goH.$reflectable=1
+function XN(rO,WT,AP,fn){this.rO=rO
+this.WT=WT
+this.AP=AP
+this.fn=fn}XN.builtin$cls="XN"
+if(!"name" in XN)XN.name="XN"
+$desc=$collectedClasses.XN
+if($desc instanceof Array)$desc=$desc[1]
+XN.prototype=$desc
+XN.prototype.gWT=function(receiver){return this.WT}
+XN.prototype.gWT.$reflectable=1
+function No(ec,i2){this.ec=ec
+this.i2=i2}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.sec=function(v){return this.ec=v}
+No.prototype.gi2=function(){return this.i2}
+No.prototype.gi2.$reflectable=1
+function PG(){}PG.builtin$cls="PG"
+if(!"name" in PG)PG.name="PG"
+$desc=$collectedClasses.PG
+if($desc instanceof Array)$desc=$desc[1]
+PG.prototype=$desc
+function YW(){}YW.builtin$cls="YW"
+if(!"name" in YW)YW.name="YW"
+$desc=$collectedClasses.YW
+if($desc instanceof Array)$desc=$desc[1]
+YW.prototype=$desc
+function BO(a){this.a=a}BO.builtin$cls="BO"
+if(!"name" in BO)BO.name="BO"
+$desc=$collectedClasses.BO
+if($desc instanceof Array)$desc=$desc[1]
+BO.prototype=$desc
+function Yu(a,b){this.a=a
+this.b=b}Yu.builtin$cls="Yu"
+if(!"name" in Yu)Yu.name="Yu"
+$desc=$collectedClasses.Yu
+if($desc instanceof Array)$desc=$desc[1]
+Yu.prototype=$desc
+function y2(c){this.c=c}y2.builtin$cls="y2"
+if(!"name" in y2)y2.name="y2"
+$desc=$collectedClasses.y2
+if($desc instanceof Array)$desc=$desc[1]
+y2.prototype=$desc
+function Hq(d){this.d=d}Hq.builtin$cls="Hq"
+if(!"name" in Hq)Hq.name="Hq"
+$desc=$collectedClasses.Hq
+if($desc instanceof Array)$desc=$desc[1]
+Hq.prototype=$desc
+function Pl(a){this.a=a}Pl.builtin$cls="Pl"
+if(!"name" in Pl)Pl.name="Pl"
+$desc=$collectedClasses.Pl
+if($desc instanceof Array)$desc=$desc[1]
+Pl.prototype=$desc
+function XK(Yu,ec,i2,AP,fn){this.Yu=Yu
+this.ec=ec
+this.i2=i2
+this.AP=AP
+this.fn=fn}XK.builtin$cls="XK"
+if(!"name" in XK)XK.name="XK"
+$desc=$collectedClasses.XK
+if($desc instanceof Array)$desc=$desc[1]
+XK.prototype=$desc
+XK.prototype.gYu=function(){return this.Yu}
+function ho(Ct,pL,ec,i2,AP,fn){this.Ct=Ct
+this.pL=pL
+this.ec=ec
+this.i2=i2
+this.AP=AP
+this.fn=fn}ho.builtin$cls="ho"
+if(!"name" in ho)ho.name="ho"
+$desc=$collectedClasses.ho
+if($desc instanceof Array)$desc=$desc[1]
+ho.prototype=$desc
+function G6(BW,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27078,11 +27499,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 Ur(){}Ur.builtin$cls="Ur"
+if(!"name" in Ur)Ur.name="Ur"
+$desc=$collectedClasses.Ur
 if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ur.prototype=$desc
 function j3(a){this.a=a}j3.builtin$cls="j3"
 if(!"name" in j3)j3.name="j3"
 $desc=$collectedClasses.j3
@@ -27093,12 +27514,11 @@
 $desc=$collectedClasses.i0
 if($desc instanceof Array)$desc=$desc[1]
 i0.prototype=$desc
-function Tg(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function Tg(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27115,10 +27535,10 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Ps(F0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Ps(F0,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27139,11 +27559,11 @@
 Ps.prototype.gF0.$reflectable=1
 Ps.prototype.sF0=function(receiver,v){return receiver.F0=v}
 Ps.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+function KU(){}KU.builtin$cls="KU"
+if(!"name" in KU)KU.name="KU"
+$desc=$collectedClasses.KU
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+KU.prototype=$desc
 function RI(a){this.a=a}RI.builtin$cls="RI"
 if(!"name" in RI)RI.name="RI"
 $desc=$collectedClasses.RI
@@ -27154,12 +27574,11 @@
 $desc=$collectedClasses.Ye
 if($desc instanceof Array)$desc=$desc[1]
 Ye.prototype=$desc
-function CN(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function CN(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27176,10 +27595,10 @@
 $desc=$collectedClasses.CN
 if($desc instanceof Array)$desc=$desc[1]
 CN.prototype=$desc
-function vc(eJ,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eJ=eJ
+function HT(eJ,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eJ=eJ
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27191,28 +27610,25 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}vc.builtin$cls="vc"
-if(!"name" in vc)vc.name="vc"
-$desc=$collectedClasses.vc
+this.X0=X0}HT.builtin$cls="HT"
+if(!"name" in HT)HT.name="HT"
+$desc=$collectedClasses.HT
 if($desc instanceof Array)$desc=$desc[1]
-vc.prototype=$desc
-vc.prototype.geJ=function(receiver){return receiver.eJ}
-vc.prototype.geJ.$reflectable=1
-vc.prototype.seJ=function(receiver,v){return receiver.eJ=v}
-vc.prototype.seJ.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+HT.prototype=$desc
+HT.prototype.geJ=function(receiver){return receiver.eJ}
+HT.prototype.geJ.$reflectable=1
+HT.prototype.seJ=function(receiver,v){return receiver.eJ=v}
+HT.prototype.seJ.$reflectable=1
+function qbd(){}qbd.builtin$cls="qbd"
+if(!"name" in qbd)qbd.name="qbd"
+$desc=$collectedClasses.qbd
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
-function E0(zh,HX,Uy,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
+qbd.prototype=$desc
+function E0(zh,HX,Uy,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -27239,11 +27655,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 Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+Ds.prototype=$desc
 function lw(GV,Hu,nx,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
@@ -27275,11 +27691,11 @@
 lw.prototype.gnx.$reflectable=1
 lw.prototype.snx=function(receiver,v){return receiver.nx=v}
 lw.prototype.snx.$reflectable=1
-function Nr(){}Nr.builtin$cls="Nr"
-if(!"name" in Nr)Nr.name="Nr"
-$desc=$collectedClasses.Nr
+function LP(){}LP.builtin$cls="LP"
+if(!"name" in LP)LP.name="LP"
+$desc=$collectedClasses.LP
 if($desc instanceof Array)$desc=$desc[1]
-Nr.prototype=$desc
+LP.prototype=$desc
 function wJ(){}wJ.builtin$cls="wJ"
 if(!"name" in wJ)wJ.name="wJ"
 $desc=$collectedClasses.wJ
@@ -27498,10 +27914,10 @@
 $desc=$collectedClasses.YX
 if($desc instanceof Array)$desc=$desc[1]
 YX.prototype=$desc
-function BI(AY,XW,BB,eL,If){this.AY=AY
+function BI(AY,XW,BB,Ra,If){this.AY=AY
 this.XW=XW
 this.BB=BB
-this.eL=eL
+this.Ra=Ra
 this.If=If}BI.builtin$cls="BI"
 if(!"name" in BI)BI.name="BI"
 $desc=$collectedClasses.BI
@@ -27530,7 +27946,7 @@
 $desc=$collectedClasses.mg
 if($desc instanceof Array)$desc=$desc[1]
 mg.prototype=$desc
-function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,eL,RH,If){this.NK=NK
+function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If){this.NK=NK
 this.EZ=EZ
 this.ut=ut
 this.Db=Db
@@ -27543,7 +27959,7 @@
 this.qu=qu
 this.qN=qN
 this.qm=qm
-this.eL=eL
+this.Ra=Ra
 this.RH=RH
 this.If=If}bl.builtin$cls="bl"
 if(!"name" in bl)bl.name="bl"
@@ -27570,7 +27986,7 @@
 $desc=$collectedClasses.Ax
 if($desc instanceof Array)$desc=$desc[1]
 Ax.prototype=$desc
-function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,eL,RH,nz,If){this.Cr=Cr
+function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If){this.Cr=Cr
 this.Tx=Tx
 this.H8=H8
 this.Ht=Ht
@@ -27589,7 +28005,7 @@
 this.xO=xO
 this.qm=qm
 this.UF=UF
-this.eL=eL
+this.Ra=Ra
 this.RH=RH
 this.nz=nz
 this.If=If}Wf.builtin$cls="Wf"
@@ -27767,16 +28183,16 @@
 JI.prototype.siE=function(v){return this.iE=v}
 JI.prototype.gSJ=function(){return this.SJ}
 JI.prototype.sSJ=function(v){return this.SJ=v}
-function Ks(iE,SJ){this.iE=iE
-this.SJ=SJ}Ks.builtin$cls="Ks"
-if(!"name" in Ks)Ks.name="Ks"
-$desc=$collectedClasses.Ks
+function LO(iE,SJ){this.iE=iE
+this.SJ=SJ}LO.builtin$cls="LO"
+if(!"name" in LO)LO.name="LO"
+$desc=$collectedClasses.LO
 if($desc instanceof Array)$desc=$desc[1]
-Ks.prototype=$desc
-Ks.prototype.giE=function(){return this.iE}
-Ks.prototype.siE=function(v){return this.iE=v}
-Ks.prototype.gSJ=function(){return this.SJ}
-Ks.prototype.sSJ=function(v){return this.SJ=v}
+LO.prototype=$desc
+LO.prototype.giE=function(){return this.iE}
+LO.prototype.siE=function(v){return this.iE=v}
+LO.prototype.gSJ=function(){return this.SJ}
+LO.prototype.sSJ=function(v){return this.SJ=v}
 function dz(nL,QC,Gv,iE,SJ,WX,Ip){this.nL=nL
 this.QC=QC
 this.Gv=Gv
@@ -28095,12 +28511,12 @@
 $desc=$collectedClasses.O9
 if($desc instanceof Array)$desc=$desc[1]
 O9.prototype=$desc
-function oh(Y8){this.Y8=Y8}oh.builtin$cls="oh"
-if(!"name" in oh)oh.name="oh"
-$desc=$collectedClasses.oh
+function yU(Y8){this.Y8=Y8}yU.builtin$cls="yU"
+if(!"name" in yU)yU.name="yU"
+$desc=$collectedClasses.yU
 if($desc instanceof Array)$desc=$desc[1]
-oh.prototype=$desc
-oh.prototype.gY8=function(){return this.Y8}
+yU.prototype=$desc
+yU.prototype.gY8=function(){return this.Y8}
 function nP(){}nP.builtin$cls="nP"
 if(!"name" in nP)nP.name="nP"
 $desc=$collectedClasses.nP
@@ -28736,13 +29152,13 @@
 $desc=$collectedClasses.Zi
 if($desc instanceof Array)$desc=$desc[1]
 Zi.prototype=$desc
-function Ud(Ct,FN){this.Ct=Ct
+function Ud(Pc,FN){this.Pc=Pc
 this.FN=FN}Ud.builtin$cls="Ud"
 if(!"name" in Ud)Ud.name="Ud"
 $desc=$collectedClasses.Ud
 if($desc instanceof Array)$desc=$desc[1]
 Ud.prototype=$desc
-function K8(Ct,FN){this.Ct=Ct
+function K8(Pc,FN){this.Pc=Pc
 this.FN=FN}K8.builtin$cls="K8"
 if(!"name" in K8)K8.name="K8"
 $desc=$collectedClasses.K8
@@ -28787,7 +29203,7 @@
 $desc=$collectedClasses.E3
 if($desc instanceof Array)$desc=$desc[1]
 E3.prototype=$desc
-function Rw(WF,ZP,EN){this.WF=WF
+function Rw(vn,ZP,EN){this.vn=vn
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
 if(!"name" in Rw)Rw.name="Rw"
@@ -28814,11 +29230,11 @@
 $desc=$collectedClasses.a2
 if($desc instanceof Array)$desc=$desc[1]
 a2.prototype=$desc
-function Tx(){}Tx.builtin$cls="Tx"
-if(!"name" in Tx)Tx.name="Tx"
-$desc=$collectedClasses.Tx
+function Rz(){}Rz.builtin$cls="Rz"
+if(!"name" in Rz)Rz.name="Rz"
+$desc=$collectedClasses.Rz
 if($desc instanceof Array)$desc=$desc[1]
-Tx.prototype=$desc
+Rz.prototype=$desc
 function iP(y3,aL){this.y3=y3
 this.aL=aL}iP.builtin$cls="iP"
 if(!"name" in iP)iP.name="iP"
@@ -28893,11 +29309,11 @@
 $desc=$collectedClasses.Np
 if($desc instanceof Array)$desc=$desc[1]
 Np.prototype=$desc
-function mp(uF,UP,mP,SA,mZ){this.uF=uF
+function mp(uF,UP,mP,SA,FZ){this.uF=uF
 this.UP=UP
 this.mP=mP
 this.SA=SA
-this.mZ=mZ}mp.builtin$cls="mp"
+this.FZ=FZ}mp.builtin$cls="mp"
 if(!"name" in mp)mp.name="mp"
 $desc=$collectedClasses.mp
 if($desc instanceof Array)$desc=$desc[1]
@@ -28968,11 +29384,11 @@
 $desc=$collectedClasses.cX
 if($desc instanceof Array)$desc=$desc[1]
 cX.prototype=$desc
-function Yl(){}Yl.builtin$cls="Yl"
-if(!"name" in Yl)Yl.name="Yl"
-$desc=$collectedClasses.Yl
+function AC(){}AC.builtin$cls="AC"
+if(!"name" in AC)AC.name="AC"
+$desc=$collectedClasses.AC
 if($desc instanceof Array)$desc=$desc[1]
-Yl.prototype=$desc
+AC.prototype=$desc
 function Z0(){}Z0.builtin$cls="Z0"
 if(!"name" in Z0)Z0.name="Z0"
 $desc=$collectedClasses.Z0
@@ -29022,14 +29438,14 @@
 $desc=$collectedClasses.uq
 if($desc instanceof Array)$desc=$desc[1]
 uq.prototype=$desc
-function iD(NN,HC,r0,Fi,ku,tP,Ka,YG,yW){this.NN=NN
+function iD(NN,HC,r0,Fi,ku,tP,Ka,hO,yW){this.NN=NN
 this.HC=HC
 this.r0=r0
 this.Fi=Fi
 this.ku=ku
 this.tP=tP
 this.Ka=Ka
-this.YG=YG
+this.hO=hO
 this.yW=yW}iD.builtin$cls="iD"
 if(!"name" in iD)iD.name="iD"
 $desc=$collectedClasses.iD
@@ -29350,11 +29766,11 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function bO(Vy){this.Vy=Vy}bO.builtin$cls="bO"
-if(!"name" in bO)bO.name="bO"
-$desc=$collectedClasses.bO
+function hP(vm){this.vm=vm}hP.builtin$cls="hP"
+if(!"name" in hP)hP.name="hP"
+$desc=$collectedClasses.hP
 if($desc instanceof Array)$desc=$desc[1]
-bO.prototype=$desc
+hP.prototype=$desc
 function Gm(){}Gm.builtin$cls="Gm"
 if(!"name" in Gm)Gm.name="Gm"
 $desc=$collectedClasses.Gm
@@ -29504,14 +29920,14 @@
 $desc=$collectedClasses.Ys
 if($desc instanceof Array)$desc=$desc[1]
 Ys.prototype=$desc
-function WS4(ew,yz,nV,V3){this.ew=ew
+function Lw(ew,yz,nV,Li){this.ew=ew
 this.yz=yz
 this.nV=nV
-this.V3=V3}WS4.builtin$cls="WS4"
-if(!"name" in WS4)WS4.name="WS4"
-$desc=$collectedClasses.WS4
+this.Li=Li}Lw.builtin$cls="Lw"
+if(!"name" in Lw)Lw.name="Lw"
+$desc=$collectedClasses.Lw
 if($desc instanceof Array)$desc=$desc[1]
-WS4.prototype=$desc
+Lw.prototype=$desc
 function Gj(EV){this.EV=EV}Gj.builtin$cls="Gj"
 if(!"name" in Gj)Gj.name="Gj"
 $desc=$collectedClasses.Gj
@@ -29567,10 +29983,7 @@
 $desc=$collectedClasses.nA
 if($desc instanceof Array)$desc=$desc[1]
 nA.prototype=$desc
-function Fv(F8,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F8=F8
-this.AP=AP
-this.fn=fn
-this.hm=hm
+function Fv(m0,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.m0=m0
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29587,19 +30000,16 @@
 $desc=$collectedClasses.Fv
 if($desc instanceof Array)$desc=$desc[1]
 Fv.prototype=$desc
-Fv.prototype.gF8=function(receiver){return receiver.F8}
-Fv.prototype.gF8.$reflectable=1
-Fv.prototype.sF8=function(receiver,v){return receiver.F8=v}
-Fv.prototype.sF8.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+Fv.prototype.gm0=function(receiver){return receiver.m0}
+Fv.prototype.gm0.$reflectable=1
+Fv.prototype.sm0=function(receiver,v){return receiver.m0=v}
+Fv.prototype.sm0.$reflectable=1
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
-function E9(Py,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
-this.AP=AP
-this.fn=fn
-this.hm=hm
+pv.prototype=$desc
+function E9(Py,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29620,17 +30030,16 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
-function m8(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+Vfx.prototype=$desc
+function m8(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29647,10 +30056,10 @@
 $desc=$collectedClasses.m8
 if($desc instanceof Array)$desc=$desc[1]
 m8.prototype=$desc
-function Gk(vt,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
+function Gk(vt,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29671,11 +30080,11 @@
 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 Urj(){}Urj.builtin$cls="Urj"
+if(!"name" in Urj)Urj.name="Urj"
+$desc=$collectedClasses.Urj
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
+Urj.prototype=$desc
 function e5(a){this.a=a}e5.builtin$cls="e5"
 if(!"name" in e5)e5.name="e5"
 $desc=$collectedClasses.e5
@@ -29686,12 +30095,11 @@
 $desc=$collectedClasses.Ni
 if($desc instanceof Array)$desc=$desc[1]
 Ni.prototype=$desc
-function AX(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function AX(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29708,10 +30116,10 @@
 $desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
 AX.prototype=$desc
-function yb(Z8,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
+function yb(Z8,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29732,11 +30140,11 @@
 yb.prototype.gZ8.$reflectable=1
 yb.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
 yb.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function oub(){}oub.builtin$cls="oub"
+if(!"name" in oub)oub.name="oub"
+$desc=$collectedClasses.oub
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+oub.prototype=$desc
 function QR(a){this.a=a}QR.builtin$cls="QR"
 if(!"name" in QR)QR.name="QR"
 $desc=$collectedClasses.QR
@@ -29747,19 +30155,19 @@
 $desc=$collectedClasses.Yx
 if($desc instanceof Array)$desc=$desc[1]
 Yx.prototype=$desc
-function NM(GQ,J0,Oc,CO,bV,vR,LY,q3,Ol,X3,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
+function NM(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
 this.CO=CO
 this.bV=bV
-this.vR=vR
+this.kg=kg
 this.LY=LY
 this.q3=q3
 this.Ol=Ol
 this.X3=X3
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29796,10 +30204,10 @@
 NM.prototype.gbV.$reflectable=1
 NM.prototype.sbV=function(receiver,v){return receiver.bV=v}
 NM.prototype.sbV.$reflectable=1
-NM.prototype.gvR=function(receiver){return receiver.vR}
-NM.prototype.gvR.$reflectable=1
-NM.prototype.svR=function(receiver,v){return receiver.vR=v}
-NM.prototype.svR.$reflectable=1
+NM.prototype.gkg=function(receiver){return receiver.kg}
+NM.prototype.gkg.$reflectable=1
+NM.prototype.skg=function(receiver,v){return receiver.kg=v}
+NM.prototype.skg.$reflectable=1
 NM.prototype.gLY=function(receiver){return receiver.LY}
 NM.prototype.gLY.$reflectable=1
 NM.prototype.sLY=function(receiver,v){return receiver.LY=v}
@@ -29816,11 +30224,11 @@
 NM.prototype.gX3.$reflectable=1
 NM.prototype.sX3=function(receiver,v){return receiver.X3=v}
 NM.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function c4r(){}c4r.builtin$cls="c4r"
+if(!"name" in c4r)c4r.name="c4r"
+$desc=$collectedClasses.c4r
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+c4r.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -29935,12 +30343,11 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function pR(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29967,10 +30374,10 @@
 $desc=$collectedClasses.fM
 if($desc instanceof Array)$desc=$desc[1]
 fM.prototype=$desc
-function hx(Xh,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
+function hx(Xh,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29991,12 +30398,38 @@
 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 Squ(){}Squ.builtin$cls="Squ"
+if(!"name" in Squ)Squ.name="Squ"
+$desc=$collectedClasses.Squ
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
-function u7(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
+Squ.prototype=$desc
+function PO(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
+this.AP=AP
+this.fn=fn
+this.AP=AP
+this.fn=fn
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}PO.builtin$cls="PO"
+if(!"name" in PO)PO.name="PO"
+$desc=$collectedClasses.PO
+if($desc instanceof Array)$desc=$desc[1]
+PO.prototype=$desc
+PO.prototype.gpC=function(receiver){return receiver.pC}
+PO.prototype.gpC.$reflectable=1
+PO.prototype.spC=function(receiver,v){return receiver.pC=v}
+PO.prototype.spC.$reflectable=1
+function Vf(){}Vf.builtin$cls="Vf"
+if(!"name" in Vf)Vf.name="Vf"
+$desc=$collectedClasses.Vf
+if($desc instanceof Array)$desc=$desc[1]
+Vf.prototype=$desc
+function u7(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30023,13 +30456,13 @@
 $desc=$collectedClasses.Ey
 if($desc instanceof Array)$desc=$desc[1]
 Ey.prototype=$desc
-function qm(Aq,tT,eT,yt,wd,oH,np,AP,fn){this.Aq=Aq
+function qm(Aq,tT,eT,yt,wd,oH,z3,AP,fn){this.Aq=Aq
 this.tT=tT
 this.eT=eT
 this.yt=yt
 this.wd=wd
 this.oH=oH
-this.np=np
+this.z3=z3
 this.AP=AP
 this.fn=fn}qm.builtin$cls="qm"
 if(!"name" in qm)qm.name="qm"
@@ -30044,14 +30477,17 @@
 $desc=$collectedClasses.vO
 if($desc instanceof Array)$desc=$desc[1]
 vO.prototype=$desc
-function E7(BA,fb,qY,qO,Hm,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BA=BA
+function E7(SS,fb,qY,qO,Hm,pD,eH,vk,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.SS=SS
 this.fb=fb
 this.qY=qY
 this.qO=qO
 this.Hm=Hm
+this.pD=pD
+this.eH=eH
+this.vk=vk
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30068,10 +30504,10 @@
 $desc=$collectedClasses.E7
 if($desc instanceof Array)$desc=$desc[1]
 E7.prototype=$desc
-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.gSS=function(receiver){return receiver.SS}
+E7.prototype.gSS.$reflectable=1
+E7.prototype.sSS=function(receiver,v){return receiver.SS=v}
+E7.prototype.sSS.$reflectable=1
 E7.prototype.gfb=function(receiver){return receiver.fb}
 E7.prototype.gfb.$reflectable=1
 E7.prototype.gqY=function(receiver){return receiver.qY}
@@ -30084,26 +30520,34 @@
 E7.prototype.gHm.$reflectable=1
 E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
 E7.prototype.sHm.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+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.geH=function(receiver){return receiver.eH}
+E7.prototype.geH.$reflectable=1
+E7.prototype.seH=function(receiver,v){return receiver.eH=v}
+E7.prototype.seH.$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
+function KUl(){}KUl.builtin$cls="KUl"
+if(!"name" in KUl)KUl.name="KUl"
+$desc=$collectedClasses.KUl
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
-function SV(a,b){this.a=a
-this.b=b}SV.builtin$cls="SV"
+KUl.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 vH(c){this.c=c}vH.builtin$cls="vH"
-if(!"name" in vH)vH.name="vH"
-$desc=$collectedClasses.vH
+function Mf(){}Mf.builtin$cls="Mf"
+if(!"name" in Mf)Mf.name="Mf"
+$desc=$collectedClasses.Mf
 if($desc instanceof Array)$desc=$desc[1]
-vH.prototype=$desc
-function St(Pw,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
-this.AP=AP
-this.fn=fn
-this.hm=hm
+Mf.prototype=$desc
+function Kz(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30115,27 +30559,15 @@
 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
+this.X0=X0}Kz.builtin$cls="Kz"
+if(!"name" in Kz)Kz.name="Kz"
+$desc=$collectedClasses.Kz
 if($desc instanceof Array)$desc=$desc[1]
-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 V0(){}V0.builtin$cls="V0"
-if(!"name" in V0)V0.name="V0"
-$desc=$collectedClasses.V0
-if($desc instanceof Array)$desc=$desc[1]
-V0.prototype=$desc
-function vj(eb,kf,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
+Kz.prototype=$desc
+function vj(eb,kf,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30158,17 +30590,16 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
-function LU(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+tuj.prototype=$desc
+function LU(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30185,10 +30616,10 @@
 $desc=$collectedClasses.LU
 if($desc instanceof Array)$desc=$desc[1]
 LU.prototype=$desc
-function T2(N7,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
+function T2(N7,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30209,21 +30640,21 @@
 T2.prototype.gN7.$reflectable=1
 T2.prototype.sN7=function(receiver,v){return receiver.N7=v}
 T2.prototype.sN7.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function mHk(){}mHk.builtin$cls="mHk"
+if(!"name" in mHk)mHk.name="mHk"
+$desc=$collectedClasses.mHk
 if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+mHk.prototype=$desc
 function Jq(a){this.a=a}Jq.builtin$cls="Jq"
 if(!"name" in Jq)Jq.name="Jq"
 $desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
 Jq.prototype=$desc
-function RJ(){}RJ.builtin$cls="RJ"
-if(!"name" in RJ)RJ.name="RJ"
-$desc=$collectedClasses.RJ
+function Yn(){}Yn.builtin$cls="Yn"
+if(!"name" in Yn)Yn.name="Yn"
+$desc=$collectedClasses.Yn
 if($desc instanceof Array)$desc=$desc[1]
-RJ.prototype=$desc
+Yn.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30277,8 +30708,8 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function PF(Gj,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Gj=Gj
-this.hm=hm
+function PF(Gj,ah,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Gj=Gj
+this.ah=ah
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30299,12 +30730,21 @@
 PF.prototype.gGj.$reflectable=1
 PF.prototype.sGj=function(receiver,v){return receiver.Gj=v}
 PF.prototype.sGj.$reflectable=1
-function T4(T9,Jt){this.T9=T9
-this.Jt=Jt}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+PF.prototype.gah=function(receiver){return receiver.ah}
+PF.prototype.gah.$reflectable=1
+PF.prototype.sah=function(receiver,v){return receiver.ah=v}
+PF.prototype.sah.$reflectable=1
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+Vct.prototype=$desc
+function fA(T9,Bu){this.T9=T9
+this.Bu=Bu}fA.builtin$cls="fA"
+if(!"name" in fA)fA.name="fA"
+$desc=$collectedClasses.fA
+if($desc instanceof Array)$desc=$desc[1]
+fA.prototype=$desc
 function Qz(){}Qz.builtin$cls="Qz"
 if(!"name" in Qz)Qz.name="Qz"
 $desc=$collectedClasses.Qz
@@ -30316,20 +30756,17 @@
 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 c5(){}c5.builtin$cls="c5"
 if(!"name" in c5)c5.name="c5"
 $desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
 c5.prototype=$desc
-function F1(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
-this.AP=AP
-this.fn=fn
-this.AP=AP
+function F1(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.fn=fn
 this.dZ=dZ
 this.Sa=Sa
@@ -30343,14 +30780,11 @@
 $desc=$collectedClasses.F1
 if($desc instanceof Array)$desc=$desc[1]
 F1.prototype=$desc
-function aQ(KU,ZC,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+function aQ(uy,ZC,Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
 this.ZC=ZC
 this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30365,10 +30799,10 @@
 $desc=$collectedClasses.aQ
 if($desc instanceof Array)$desc=$desc[1]
 aQ.prototype=$desc
-aQ.prototype.gKU=function(receiver){return receiver.KU}
-aQ.prototype.gKU.$reflectable=1
-aQ.prototype.sKU=function(receiver,v){return receiver.KU=v}
-aQ.prototype.sKU.$reflectable=1
+aQ.prototype.guy=function(receiver){return receiver.uy}
+aQ.prototype.guy.$reflectable=1
+aQ.prototype.suy=function(receiver,v){return receiver.uy=v}
+aQ.prototype.suy.$reflectable=1
 aQ.prototype.gZC=function(receiver){return receiver.ZC}
 aQ.prototype.gZC.$reflectable=1
 aQ.prototype.sZC=function(receiver,v){return receiver.ZC=v}
@@ -30377,18 +30811,15 @@
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
-function Qa(KU,ZC,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+D13.prototype=$desc
+function Ya5(uy,ZC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
 this.ZC=ZC
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30398,31 +30829,28 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Qa.builtin$cls="Qa"
-if(!"name" in Qa)Qa.name="Qa"
-$desc=$collectedClasses.Qa
+this.X0=X0}Ya5.builtin$cls="Ya5"
+if(!"name" in Ya5)Ya5.name="Ya5"
+$desc=$collectedClasses.Ya5
 if($desc instanceof Array)$desc=$desc[1]
-Qa.prototype=$desc
-Qa.prototype.gKU=function(receiver){return receiver.KU}
-Qa.prototype.gKU.$reflectable=1
-Qa.prototype.sKU=function(receiver,v){return receiver.KU=v}
-Qa.prototype.sKU.$reflectable=1
-Qa.prototype.gZC=function(receiver){return receiver.ZC}
-Qa.prototype.gZC.$reflectable=1
-Qa.prototype.sZC=function(receiver,v){return receiver.ZC=v}
-Qa.prototype.sZC.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+Ya5.prototype=$desc
+Ya5.prototype.guy=function(receiver){return receiver.uy}
+Ya5.prototype.guy.$reflectable=1
+Ya5.prototype.suy=function(receiver,v){return receiver.uy=v}
+Ya5.prototype.suy.$reflectable=1
+Ya5.prototype.gZC=function(receiver){return receiver.ZC}
+Ya5.prototype.gZC.$reflectable=1
+Ya5.prototype.sZC=function(receiver,v){return receiver.ZC=v}
+Ya5.prototype.sZC.$reflectable=1
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
-function vI(rU,SB,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
+WZq.prototype=$desc
+function Ww(rU,SB,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30432,28 +30860,25 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}vI.builtin$cls="vI"
-if(!"name" in vI)vI.name="vI"
-$desc=$collectedClasses.vI
+this.X0=X0}Ww.builtin$cls="Ww"
+if(!"name" in Ww)Ww.name="Ww"
+$desc=$collectedClasses.Ww
 if($desc instanceof Array)$desc=$desc[1]
-vI.prototype=$desc
-vI.prototype.grU=function(receiver){return receiver.rU}
-vI.prototype.grU.$reflectable=1
-vI.prototype.srU=function(receiver,v){return receiver.rU=v}
-vI.prototype.srU.$reflectable=1
-vI.prototype.gSB=function(receiver){return receiver.SB}
-vI.prototype.gSB.$reflectable=1
-vI.prototype.sSB=function(receiver,v){return receiver.SB=v}
-vI.prototype.sSB.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+Ww.prototype=$desc
+Ww.prototype.grU=function(receiver){return receiver.rU}
+Ww.prototype.grU.$reflectable=1
+Ww.prototype.srU=function(receiver,v){return receiver.rU=v}
+Ww.prototype.srU.$reflectable=1
+Ww.prototype.gSB=function(receiver){return receiver.SB}
+Ww.prototype.gSB.$reflectable=1
+Ww.prototype.sSB=function(receiver,v){return receiver.SB=v}
+Ww.prototype.sSB.$reflectable=1
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
-function tz(Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
-this.AP=AP
-this.fn=fn
-this.hm=hm
+pva.prototype=$desc
+function tz(Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30474,16 +30899,15 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
 if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
-function fl(iy,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.iy=iy
-this.Jo=Jo
+cda.prototype=$desc
+function fl(Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30500,24 +30924,20 @@
 $desc=$collectedClasses.fl
 if($desc instanceof Array)$desc=$desc[1]
 fl.prototype=$desc
-fl.prototype.giy=function(receiver){return receiver.iy}
-fl.prototype.giy.$reflectable=1
-fl.prototype.siy=function(receiver,v){return receiver.iy=v}
-fl.prototype.siy.$reflectable=1
 fl.prototype.gJo=function(receiver){return receiver.Jo}
 fl.prototype.gJo.$reflectable=1
 fl.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 fl.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function qFb(){}qFb.builtin$cls="qFb"
+if(!"name" in qFb)qFb.name="qFb"
+$desc=$collectedClasses.qFb
 if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
-function Zt(Ap,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
+qFb.prototype=$desc
+function oM(Ap,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30529,29 +30949,29 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Zt.builtin$cls="Zt"
-if(!"name" in Zt)Zt.name="Zt"
-$desc=$collectedClasses.Zt
+this.X0=X0}oM.builtin$cls="oM"
+if(!"name" in oM)oM.name="oM"
+$desc=$collectedClasses.oM
 if($desc instanceof Array)$desc=$desc[1]
-Zt.prototype=$desc
-Zt.prototype.gAp=function(receiver){return receiver.Ap}
-Zt.prototype.gAp.$reflectable=1
-Zt.prototype.sAp=function(receiver,v){return receiver.Ap=v}
-Zt.prototype.sAp.$reflectable=1
-Zt.prototype.gJo=function(receiver){return receiver.Jo}
-Zt.prototype.gJo.$reflectable=1
-Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
-Zt.prototype.sJo.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+oM.prototype=$desc
+oM.prototype.gAp=function(receiver){return receiver.Ap}
+oM.prototype.gAp.$reflectable=1
+oM.prototype.sAp=function(receiver,v){return receiver.Ap=v}
+oM.prototype.sAp.$reflectable=1
+oM.prototype.gJo=function(receiver){return receiver.Jo}
+oM.prototype.gJo.$reflectable=1
+oM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
+oM.prototype.sJo.$reflectable=1
+function rna(){}rna.builtin$cls="rna"
+if(!"name" in rna)rna.name="rna"
+$desc=$collectedClasses.rna
 if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
-function wM(Au,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
+rna.prototype=$desc
+function wM(Au,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30576,334 +30996,13 @@
 wM.prototype.gJo.$reflectable=1
 wM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 wM.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function Vba(){}Vba.builtin$cls="Vba"
+if(!"name" in Vba)Vba.name="Vba"
+$desc=$collectedClasses.Vba
 if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
-function mL(Z6,DF,nI,AP,fn){this.Z6=Z6
-this.DF=DF
-this.nI=nI
-this.AP=AP
-this.fn=fn}mL.builtin$cls="mL"
-if(!"name" in mL)mL.name="mL"
-$desc=$collectedClasses.mL
-if($desc instanceof Array)$desc=$desc[1]
-mL.prototype=$desc
-mL.prototype.gZ6=function(){return this.Z6}
-mL.prototype.gZ6.$reflectable=1
-mL.prototype.gDF=function(){return this.DF}
-mL.prototype.gDF.$reflectable=1
-mL.prototype.gnI=function(){return this.nI}
-mL.prototype.gnI.$reflectable=1
-function Kf(oV){this.oV=oV}Kf.builtin$cls="Kf"
-if(!"name" in Kf)Kf.name="Kf"
-$desc=$collectedClasses.Kf
-if($desc instanceof Array)$desc=$desc[1]
-Kf.prototype=$desc
-Kf.prototype.goV=function(){return this.oV}
-function qu(YZ,bG){this.YZ=YZ
-this.bG=bG}qu.builtin$cls="qu"
-if(!"name" in qu)qu.name="qu"
-$desc=$collectedClasses.qu
-if($desc instanceof Array)$desc=$desc[1]
-qu.prototype=$desc
-qu.prototype.gbG=function(receiver){return this.bG}
-function bv(WP,XR,Z0,md,mY,e8,F3,Gg,LE,iP,mU,mM,Td,AP,fn){this.WP=WP
-this.XR=XR
-this.Z0=Z0
-this.md=md
-this.mY=mY
-this.e8=e8
-this.F3=F3
-this.Gg=Gg
-this.LE=LE
-this.iP=iP
-this.mU=mU
-this.mM=mM
-this.Td=Td
-this.AP=AP
-this.fn=fn}bv.builtin$cls="bv"
-if(!"name" in bv)bv.name="bv"
-$desc=$collectedClasses.bv
-if($desc instanceof Array)$desc=$desc[1]
-bv.prototype=$desc
-bv.prototype.gXR=function(){return this.XR}
-bv.prototype.gXR.$reflectable=1
-bv.prototype.gZ0=function(){return this.Z0}
-bv.prototype.gZ0.$reflectable=1
-bv.prototype.gLE=function(){return this.LE}
-bv.prototype.gLE.$reflectable=1
-function eS(a){this.a=a}eS.builtin$cls="eS"
-if(!"name" in eS)eS.name="eS"
-$desc=$collectedClasses.eS
-if($desc instanceof Array)$desc=$desc[1]
-eS.prototype=$desc
-function IQ(){}IQ.builtin$cls="IQ"
-if(!"name" in IQ)IQ.name="IQ"
-$desc=$collectedClasses.IQ
-if($desc instanceof Array)$desc=$desc[1]
-IQ.prototype=$desc
-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 yU(XT,i2,AP,fn){this.XT=XT
-this.i2=i2
-this.AP=AP
-this.fn=fn}yU.builtin$cls="yU"
-if(!"name" in yU)yU.name="yU"
-$desc=$collectedClasses.yU
-if($desc instanceof Array)$desc=$desc[1]
-yU.prototype=$desc
-yU.prototype.sXT=function(v){return this.XT=v}
-yU.prototype.gi2=function(){return this.i2}
-yU.prototype.gi2.$reflectable=1
-function Ub(a){this.a=a}Ub.builtin$cls="Ub"
-if(!"name" in Ub)Ub.name="Ub"
-$desc=$collectedClasses.Ub
-if($desc instanceof Array)$desc=$desc[1]
-Ub.prototype=$desc
-function dY(a){this.a=a}dY.builtin$cls="dY"
-if(!"name" in dY)dY.name="dY"
-$desc=$collectedClasses.dY
-if($desc instanceof Array)$desc=$desc[1]
-dY.prototype=$desc
-function vY(a,b){this.a=a
-this.b=b}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 zZ(c){this.c=c}zZ.builtin$cls="zZ"
-if(!"name" in zZ)zZ.name="zZ"
-$desc=$collectedClasses.zZ
-if($desc instanceof Array)$desc=$desc[1]
-zZ.prototype=$desc
-function dS(d){this.d=d}dS.builtin$cls="dS"
-if(!"name" in dS)dS.name="dS"
-$desc=$collectedClasses.dS
-if($desc instanceof Array)$desc=$desc[1]
-dS.prototype=$desc
-function dZ(XT,WP,kg,UL,AP,fn){this.XT=XT
-this.WP=WP
-this.kg=kg
-this.UL=UL
-this.AP=AP
-this.fn=fn}dZ.builtin$cls="dZ"
-if(!"name" in dZ)dZ.name="dZ"
-$desc=$collectedClasses.dZ
-if($desc instanceof Array)$desc=$desc[1]
-dZ.prototype=$desc
-dZ.prototype.sXT=function(v){return this.XT=v}
-function Qe(a){this.a=a}Qe.builtin$cls="Qe"
-if(!"name" in Qe)Qe.name="Qe"
-$desc=$collectedClasses.Qe
-if($desc instanceof Array)$desc=$desc[1]
-Qe.prototype=$desc
-function DP(Yu,m7,L4,Fv,ZZ,AP,fn){this.Yu=Yu
-this.m7=m7
-this.L4=L4
-this.Fv=Fv
-this.ZZ=ZZ
-this.AP=AP
-this.fn=fn}DP.builtin$cls="DP"
-if(!"name" in DP)DP.name="DP"
-$desc=$collectedClasses.DP
-if($desc instanceof Array)$desc=$desc[1]
-DP.prototype=$desc
-DP.prototype.gYu=function(){return this.Yu}
-DP.prototype.gYu.$reflectable=1
-DP.prototype.gm7=function(){return this.m7}
-DP.prototype.gm7.$reflectable=1
-DP.prototype.gL4=function(){return this.L4}
-DP.prototype.gL4.$reflectable=1
-function WAE(eg){this.eg=eg}WAE.builtin$cls="WAE"
-if(!"name" in WAE)WAE.name="WAE"
-$desc=$collectedClasses.WAE
-if($desc instanceof Array)$desc=$desc[1]
-WAE.prototype=$desc
-function N8(Yu,z4,Iw){this.Yu=Yu
-this.z4=z4
-this.Iw=Iw}N8.builtin$cls="N8"
-if(!"name" in N8)N8.name="N8"
-$desc=$collectedClasses.N8
-if($desc instanceof Array)$desc=$desc[1]
-N8.prototype=$desc
-N8.prototype.gYu=function(){return this.Yu}
-function Vi(tT,Ou){this.tT=tT
-this.Ou=Ou}Vi.builtin$cls="Vi"
-if(!"name" in Vi)Vi.name="Vi"
-$desc=$collectedClasses.Vi
-if($desc instanceof Array)$desc=$desc[1]
-Vi.prototype=$desc
-Vi.prototype.gtT=function(receiver){return this.tT}
-Vi.prototype.gOu=function(){return this.Ou}
-function kx(fY,vg,Mb,a0,VS,hw,fF,Du,va,Qo,uP,mY,B0,AP,fn){this.fY=fY
-this.vg=vg
-this.Mb=Mb
-this.a0=a0
-this.VS=VS
-this.hw=hw
-this.fF=fF
-this.Du=Du
-this.va=va
-this.Qo=Qo
-this.uP=uP
-this.mY=mY
-this.B0=B0
-this.AP=AP
-this.fn=fn}kx.builtin$cls="kx"
-if(!"name" in kx)kx.name="kx"
-$desc=$collectedClasses.kx
-if($desc instanceof Array)$desc=$desc[1]
-kx.prototype=$desc
-kx.prototype.gfY=function(receiver){return this.fY}
-kx.prototype.ga0=function(){return this.a0}
-kx.prototype.gVS=function(){return this.VS}
-kx.prototype.gfF=function(){return this.fF}
-kx.prototype.gDu=function(){return this.Du}
-kx.prototype.gva=function(){return this.va}
-kx.prototype.gva.$reflectable=1
-function fx(){}fx.builtin$cls="fx"
-if(!"name" in fx)fx.name="fx"
-$desc=$collectedClasses.fx
-if($desc instanceof Array)$desc=$desc[1]
-fx.prototype=$desc
-function CM(Aq,jV,hV){this.Aq=Aq
-this.jV=jV
-this.hV=hV}CM.builtin$cls="CM"
-if(!"name" in CM)CM.name="CM"
-$desc=$collectedClasses.CM
-if($desc instanceof Array)$desc=$desc[1]
-CM.prototype=$desc
-CM.prototype.gAq=function(receiver){return this.Aq}
-CM.prototype.ghV=function(){return this.hV}
-function xn(a){this.a=a}xn.builtin$cls="xn"
-if(!"name" in xn)xn.name="xn"
-$desc=$collectedClasses.xn
-if($desc instanceof Array)$desc=$desc[1]
-xn.prototype=$desc
-function vu(){}vu.builtin$cls="vu"
-if(!"name" in vu)vu.name="vu"
-$desc=$collectedClasses.vu
-if($desc instanceof Array)$desc=$desc[1]
-vu.prototype=$desc
-function c2(Rd,eB,P2,AP,fn){this.Rd=Rd
-this.eB=eB
-this.P2=P2
-this.AP=AP
-this.fn=fn}c2.builtin$cls="c2"
-if(!"name" in c2)c2.name="c2"
-$desc=$collectedClasses.c2
-if($desc instanceof Array)$desc=$desc[1]
-c2.prototype=$desc
-c2.prototype.gRd=function(receiver){return this.Rd}
-c2.prototype.gRd.$reflectable=1
-function rj(W6,xN,ei,Hz,Sw,UK,AP,fn){this.W6=W6
-this.xN=xN
-this.ei=ei
-this.Hz=Hz
-this.Sw=Sw
-this.UK=UK
-this.AP=AP
-this.fn=fn}rj.builtin$cls="rj"
-if(!"name" in rj)rj.name="rj"
-$desc=$collectedClasses.rj
-if($desc instanceof Array)$desc=$desc[1]
-rj.prototype=$desc
-rj.prototype.gSw=function(){return this.Sw}
-rj.prototype.gSw.$reflectable=1
-function Nu(XT,e0){this.XT=XT
-this.e0=e0}Nu.builtin$cls="Nu"
-if(!"name" in Nu)Nu.name="Nu"
-$desc=$collectedClasses.Nu
-if($desc instanceof Array)$desc=$desc[1]
-Nu.prototype=$desc
-Nu.prototype.sXT=function(v){return this.XT=v}
-Nu.prototype.se0=function(v){return this.e0=v}
-function Q4(a,b,c){this.a=a
-this.b=b
-this.c=c}Q4.builtin$cls="Q4"
-if(!"name" in Q4)Q4.name="Q4"
-$desc=$collectedClasses.Q4
-if($desc instanceof Array)$desc=$desc[1]
-Q4.prototype=$desc
-function aJ(a,b){this.a=a
-this.b=b}aJ.builtin$cls="aJ"
-if(!"name" in aJ)aJ.name="aJ"
-$desc=$collectedClasses.aJ
-if($desc instanceof Array)$desc=$desc[1]
-aJ.prototype=$desc
-function u4(c,d,e){this.c=c
-this.d=d
-this.e=e}u4.builtin$cls="u4"
-if(!"name" in u4)u4.name="u4"
-$desc=$collectedClasses.u4
-if($desc instanceof Array)$desc=$desc[1]
-u4.prototype=$desc
-function pF(a){this.a=a}pF.builtin$cls="pF"
-if(!"name" in pF)pF.name="pF"
-$desc=$collectedClasses.pF
-if($desc instanceof Array)$desc=$desc[1]
-pF.prototype=$desc
-function Q2(){}Q2.builtin$cls="Q2"
-if(!"name" in Q2)Q2.name="Q2"
-$desc=$collectedClasses.Q2
-if($desc instanceof Array)$desc=$desc[1]
-Q2.prototype=$desc
-function r1(XT,e0,SI,Tj,AP,fn){this.XT=XT
-this.e0=e0
-this.SI=SI
-this.Tj=Tj
-this.AP=AP
-this.fn=fn}r1.builtin$cls="r1"
-if(!"name" in r1)r1.name="r1"
-$desc=$collectedClasses.r1
-if($desc instanceof Array)$desc=$desc[1]
-r1.prototype=$desc
-function Rb(eA,Wj,XT,e0,SI,Tj,AP,fn){this.eA=eA
-this.Wj=Wj
-this.XT=XT
-this.e0=e0
-this.SI=SI
-this.Tj=Tj
-this.AP=AP
-this.fn=fn}Rb.builtin$cls="Rb"
-if(!"name" in Rb)Rb.name="Rb"
-$desc=$collectedClasses.Rb
-if($desc instanceof Array)$desc=$desc[1]
-Rb.prototype=$desc
-function Y2(eT,yt,wd,oH){this.eT=eT
-this.yt=yt
-this.wd=wd
-this.oH=oH}Y2.builtin$cls="Y2"
-if(!"name" in Y2)Y2.name="Y2"
-$desc=$collectedClasses.Y2
-if($desc instanceof Array)$desc=$desc[1]
-Y2.prototype=$desc
-Y2.prototype.geT=function(receiver){return this.eT}
-Y2.prototype.gyt=function(){return this.yt}
-Y2.prototype.gyt.$reflectable=1
-Y2.prototype.gwd=function(receiver){return this.wd}
-Y2.prototype.gwd.$reflectable=1
-Y2.prototype.goH=function(){return this.oH}
-Y2.prototype.goH.$reflectable=1
-function XN(JL,WT,AP,fn){this.JL=JL
-this.WT=WT
-this.AP=AP
-this.fn=fn}XN.builtin$cls="XN"
-if(!"name" in XN)XN.name="XN"
-$desc=$collectedClasses.XN
-if($desc instanceof Array)$desc=$desc[1]
-XN.prototype=$desc
-XN.prototype.gWT=function(receiver){return this.WT}
-XN.prototype.gWT.$reflectable=1
-function lI(k5,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.AP=AP
-this.fn=fn
-this.hm=hm
+Vba.prototype=$desc
+function lI(k5,xH,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.xH=xH
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30924,15 +31023,16 @@
 lI.prototype.gk5.$reflectable=1
 lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
 lI.prototype.sk5.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+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 waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function uL(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
-this.AP=AP
-this.fn=fn
-this.AP=AP
+waa.prototype=$desc
+function uL(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.fn=fn
 this.dZ=dZ
 this.Sa=Sa
@@ -30946,15 +31046,6 @@
 $desc=$collectedClasses.uL
 if($desc instanceof Array)$desc=$desc[1]
 uL.prototype=$desc
-uL.prototype.ghm=function(receiver){return receiver.hm}
-uL.prototype.ghm.$reflectable=1
-uL.prototype.shm=function(receiver,v){return receiver.hm=v}
-uL.prototype.shm.$reflectable=1
-function LP(){}LP.builtin$cls="LP"
-if(!"name" in LP)LP.name="LP"
-$desc=$collectedClasses.LP
-if($desc instanceof Array)$desc=$desc[1]
-LP.prototype=$desc
 function Pi(){}Pi.builtin$cls="Pi"
 if(!"name" in Pi)Pi.name="Pi"
 $desc=$collectedClasses.Pi
@@ -31041,11 +31132,11 @@
 DA.prototype=$desc
 DA.prototype.gWA=function(){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
-function ndx(){}ndx.builtin$cls="ndx"
-if(!"name" in ndx)ndx.name="ndx"
-$desc=$collectedClasses.ndx
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
 if($desc instanceof Array)$desc=$desc[1]
-ndx.prototype=$desc
+nd.prototype=$desc
 function vly(){}vly.builtin$cls="vly"
 if(!"name" in vly)vly.name="vly"
 $desc=$collectedClasses.vly
@@ -31148,11 +31239,11 @@
 $desc=$collectedClasses.C4
 if($desc instanceof Array)$desc=$desc[1]
 C4.prototype=$desc
-function Md(){}Md.builtin$cls="Md"
-if(!"name" in Md)Md.name="Md"
-$desc=$collectedClasses.Md
+function YJ(){}YJ.builtin$cls="YJ"
+if(!"name" in YJ)YJ.name="YJ"
+$desc=$collectedClasses.YJ
 if($desc instanceof Array)$desc=$desc[1]
-Md.prototype=$desc
+YJ.prototype=$desc
 function km(a){this.a=a}km.builtin$cls="km"
 if(!"name" in km)km.name="km"
 $desc=$collectedClasses.km
@@ -31214,11 +31305,11 @@
 $desc=$collectedClasses.MX
 if($desc instanceof Array)$desc=$desc[1]
 MX.prototype=$desc
-function w9(){}w9.builtin$cls="w9"
-if(!"name" in w9)w9.name="w9"
-$desc=$collectedClasses.w9
+function w10(){}w10.builtin$cls="w10"
+if(!"name" in w10)w10.name="w10"
+$desc=$collectedClasses.w10
 if($desc instanceof Array)$desc=$desc[1]
-w9.prototype=$desc
+w10.prototype=$desc
 function r3y(a){this.a=a}r3y.builtin$cls="r3y"
 if(!"name" in r3y)r3y.name="r3y"
 $desc=$collectedClasses.r3y
@@ -31501,11 +31592,6 @@
 $desc=$collectedClasses.bX
 if($desc instanceof Array)$desc=$desc[1]
 bX.prototype=$desc
-function lP(){}lP.builtin$cls="lP"
-if(!"name" in lP)lP.name="lP"
-$desc=$collectedClasses.lP
-if($desc instanceof Array)$desc=$desc[1]
-lP.prototype=$desc
 function Uf(){}Uf.builtin$cls="Uf"
 if(!"name" in Uf)Uf.name="Uf"
 $desc=$collectedClasses.Uf
@@ -31581,6 +31667,11 @@
 $desc=$collectedClasses.w7
 if($desc instanceof Array)$desc=$desc[1]
 w7.prototype=$desc
+function w9(){}w9.builtin$cls="w9"
+if(!"name" in w9)w9.name="w9"
+$desc=$collectedClasses.w9
+if($desc instanceof Array)$desc=$desc[1]
+w9.prototype=$desc
 function c4(a){this.a=a}c4.builtin$cls="c4"
 if(!"name" in c4)c4.name="c4"
 $desc=$collectedClasses.c4
@@ -32004,7 +32095,7 @@
 $desc=$collectedClasses.cfS
 if($desc instanceof Array)$desc=$desc[1]
 cfS.prototype=$desc
-function JG(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
+function JG(kW,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kW=kW
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32021,15 +32112,23 @@
 $desc=$collectedClasses.JG
 if($desc instanceof Array)$desc=$desc[1]
 JG.prototype=$desc
-function knI(zw,AP,fn,tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
+JG.prototype.gkW=function(receiver){return receiver.kW}
+JG.prototype.gkW.$reflectable=1
+JG.prototype.skW=function(receiver,v){return receiver.kW=v}
+JG.prototype.skW.$reflectable=1
+function V0(){}V0.builtin$cls="V0"
+if(!"name" in V0)V0.name="V0"
+$desc=$collectedClasses.V0
+if($desc instanceof Array)$desc=$desc[1]
+V0.prototype=$desc
+function knI(zw,AP,fn,tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
 this.fn=fn
 this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32055,10 +32154,10 @@
 $desc=$collectedClasses.T5
 if($desc instanceof Array)$desc=$desc[1]
 T5.prototype=$desc
-function fI(Uz,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
+function fI(Uz,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32079,13 +32178,12 @@
 fI.prototype.gUz.$reflectable=1
 fI.prototype.sUz=function(receiver,v){return receiver.Uz=v}
 fI.prototype.sUz.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+function oaa(){}oaa.builtin$cls="oaa"
+if(!"name" in oaa)oaa.name="oaa"
+$desc=$collectedClasses.oaa
 if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
+oaa.prototype=$desc
+function qq(a){this.a=a}qq.builtin$cls="qq"
 if(!"name" in qq)qq.name="qq"
 $desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
@@ -32095,12 +32193,11 @@
 $desc=$collectedClasses.FC
 if($desc instanceof Array)$desc=$desc[1]
 FC.prototype=$desc
-function xI(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function xI(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32125,19 +32222,15 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-xI.prototype.gm0=function(receiver){return receiver.m0}
-xI.prototype.gm0.$reflectable=1
-xI.prototype.sm0=function(receiver,v){return receiver.m0=v}
-xI.prototype.sm0.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function Sq(){}Sq.builtin$cls="Sq"
+if(!"name" in Sq)Sq.name="Sq"
+$desc=$collectedClasses.Sq
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
-function nm(Va,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
+Sq.prototype=$desc
+function nm(Va,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32158,15 +32251,15 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function q2(){}q2.builtin$cls="q2"
+if(!"name" in q2)q2.name="q2"
+$desc=$collectedClasses.q2
 if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
-function Vu(V4,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.V4=V4
+q2.prototype=$desc
+function uwf(Up,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Up=Up
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32178,20 +32271,20 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Vu.builtin$cls="Vu"
-if(!"name" in Vu)Vu.name="Vu"
-$desc=$collectedClasses.Vu
+this.X0=X0}uwf.builtin$cls="uwf"
+if(!"name" in uwf)uwf.name="uwf"
+$desc=$collectedClasses.uwf
 if($desc instanceof Array)$desc=$desc[1]
-Vu.prototype=$desc
-Vu.prototype.gV4=function(receiver){return receiver.V4}
-Vu.prototype.gV4.$reflectable=1
-Vu.prototype.sV4=function(receiver,v){return receiver.V4=v}
-Vu.prototype.sV4.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+uwf.prototype=$desc
+uwf.prototype.gUp=function(receiver){return receiver.Up}
+uwf.prototype.gUp.$reflectable=1
+uwf.prototype.sUp=function(receiver,v){return receiver.Up=v}
+uwf.prototype.sUp.$reflectable=1
+function q3(){}q3.builtin$cls="q3"
+if(!"name" in q3)q3.name="q3"
+$desc=$collectedClasses.q3
 if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
+q3.prototype=$desc
 function At(a){this.a=a}At.builtin$cls="At"
 if(!"name" in At)At.name="At"
 $desc=$collectedClasses.At
@@ -32209,17 +32302,17 @@
 $desc=$collectedClasses.V2
 if($desc instanceof Array)$desc=$desc[1]
 V2.prototype=$desc
-function D8(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
+function BT(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
 this.qP=qP
 this.ZY=ZY
 this.xS=xS
 this.PB=PB
 this.eS=eS
-this.ay=ay}D8.builtin$cls="D8"
-if(!"name" in D8)D8.name="D8"
-$desc=$collectedClasses.D8
+this.ay=ay}BT.builtin$cls="BT"
+if(!"name" in BT)BT.name="BT"
+$desc=$collectedClasses.BT
 if($desc instanceof Array)$desc=$desc[1]
-D8.prototype=$desc
+BT.prototype=$desc
 function jY(Ca,qP,ZY,xS,PB,eS,ay){this.Ca=Ca
 this.qP=qP
 this.ZY=ZY
@@ -32236,11 +32329,11 @@
 $desc=$collectedClasses.H2
 if($desc instanceof Array)$desc=$desc[1]
 H2.prototype=$desc
-function YJ(){}YJ.builtin$cls="YJ"
-if(!"name" in YJ)YJ.name="YJ"
-$desc=$collectedClasses.YJ
+function DO(){}DO.builtin$cls="DO"
+if(!"name" in DO)DO.name="DO"
+$desc=$collectedClasses.DO
 if($desc instanceof Array)$desc=$desc[1]
-YJ.prototype=$desc
+DO.prototype=$desc
 function fTP(a){this.a=a}fTP.builtin$cls="fTP"
 if(!"name" in fTP)fTP.name="fTP"
 $desc=$collectedClasses.fTP
@@ -32347,10 +32440,10 @@
 $desc=$collectedClasses.ug
 if($desc instanceof Array)$desc=$desc[1]
 ug.prototype=$desc
-function DT(lr,xT,kr,Mf,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
+function DT(lr,xT,kr,Dsl,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
 this.xT=xT
 this.kr=kr
-this.Mf=Mf
+this.Dsl=Dsl
 this.QO=QO
 this.jH=jH
 this.mj=mj
@@ -32375,11 +32468,11 @@
 $desc=$collectedClasses.OB
 if($desc instanceof Array)$desc=$desc[1]
 OB.prototype=$desc
-function DO(){}DO.builtin$cls="DO"
-if(!"name" in DO)DO.name="DO"
-$desc=$collectedClasses.DO
+function lP(){}lP.builtin$cls="lP"
+if(!"name" in lP)lP.name="lP"
+$desc=$collectedClasses.lP
 if($desc instanceof Array)$desc=$desc[1]
-DO.prototype=$desc
+lP.prototype=$desc
 function p8(ud,lr,eS,ay){this.ud=ud
 this.lr=lr
 this.eS=eS
@@ -32473,11 +32566,11 @@
 $desc=$collectedClasses.wl
 if($desc instanceof Array)$desc=$desc[1]
 wl.prototype=$desc
-function ve(){}ve.builtin$cls="ve"
-if(!"name" in ve)ve.name="ve"
-$desc=$collectedClasses.ve
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-ve.prototype=$desc
+T4.prototype=$desc
 function TR(qP){this.qP=qP}TR.builtin$cls="TR"
 if(!"name" in TR)TR.name="TR"
 $desc=$collectedClasses.TR
@@ -32489,4 +32582,30 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-return[qE,ho,Gh,A0,na,Mr,zx,P2,Xk,W2,it,Az,QP,QW,jr,Ny,Zv,QQS,BR,di,d7,yJ,He,vz,vHT,n0,Em,pt,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,Aa,u5,h4,W4,jP,Hd,tA,wa,Uq,QH,Rt,X2,zU,rk,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,fJ,BK,Rv,HO,Kk,ZY,DD,EeC,Qb,PG,xe,Hw,bn,Imr,Ve,Oq,H9,o4,oU,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,FH,SN,HD,ni,jg,qj,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,CY,Wt,uaa,zD9,Ul,G5,bk,Lx,Er,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,Dn,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,hq,UL,tZ,kc,AK,ty,Nf,F2,nL,QV,q0,Q7,hF,OF,Dh,Ue,mU,NE,lC,y5,jQ,Kg,ui,mk,DQ,Sm,LM,es,eG,bd,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,tk,me,oB,nh,EI,MI,ca,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,uzr,Yd,kN,lZ,Gr,XE,GH,lo,NJ,nd,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,tL,pyk,ZD,rD,wD,Wv,yz,Fi,Ja,mj,cB,Mh,yR,GK,xJ,Nn,Et,NC,nb,Zn,xt,wx,P0,xlX,SQ,qD,TM,WZ,rn,df,Hg,L3,zz,dE,Eb,dT,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,cC,RA,IY,JH,jl,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,oo,OW,hz,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,bw,WT,jJ,XR,LI,A2,IW,F3,FD,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,dN,GT,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,G6,Vf,j3,i0,Tg,Ps,pv,RI,Ye,CN,vc,Vfx,E0,Dsd,lw,Nr,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,H6,wB,U1,SJ,SU7,Qr,w2Y,iK,GD,Sn,nI,TY,Lj,mb,am,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,U7,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,Ks,dz,tK,OR,Bg,DL,b8,j7,ff,Ia,Zf,vs,da,xw,dm,rH,ZL,rq,RW,RT,jZ,FZ,OM,qh,tG,jv,LB,zn,lz,Rl,Jb,M4,Jp,h7,pr,eN,PI,uO,j4,i9,VV,Dy,lU,OC,UH,Z5,ii,ib,MO,O9,oh,nP,KA,Vo,qB,ez,ti,LV,DS,JF,ht,CR,Qk,v1y,uR,Q0,YR,fB,nO,t3,dq,lO,aY,zG,e4,JB,Id,WH,TF,K5,Cg,Hs,dv,pV,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,ey,xd,v6,db,i5,N6,Rr,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,vX,Ba,An,bF,LD,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,wI,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,Hn,Zl,B5,a6,P7,DW,Ge,LK,AT,bJ,Np,mp,ub,ds,lj,UV,VS,t7,HG,aE,eV,kM,EH,cX,Yl,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hb,XX,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,ecX,kI,yoo,w1p,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,IU,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,ac,RS,RY,Ys,WS4,Gj,U4,B8q,Nx,LZ,Dg,Ob,Ip,Pg,Nb,nA,Fv,tuj,E9,Vct,m8,Gk,D13,e5,Ni,AX,yb,WZq,QR,Yx,NM,pva,nx,jm,xj,VB,aI,rG,yh,wO,Tm,q1,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,fM,hx,cda,u7,fW,Ey,qm,vO,E7,waa,SV,vH,St,V0,vj,V4,LU,T2,V10,Jq,RJ,TJ,dG,qV,HV,em,Lb,PF,T4,Qz,jA,PO,c5,F1,aQ,V11,Qa,V12,vI,V13,tz,V14,fl,V15,Zt,V16,wM,V17,mL,Kf,qu,bv,eS,IQ,TI,yU,Ub,dY,vY,zZ,dS,dZ,Qe,DP,WAE,N8,Vi,kx,fx,CM,xn,vu,c2,rj,Nu,Q4,aJ,u4,pF,Q2,r1,Rb,Y2,XN,lI,V18,uL,LP,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,Ay,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w9,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,Bl,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,G0,mY,GX,mB,XF,bX,lP,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,c4,z6,Ay0,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,mG,uA,vl,Li,WK,iT,ja,zw,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,cfS,JG,knI,T5,fI,V19,qq,FC,xI,Ds,nm,V20,Vu,V21,At,Sb,V2,D8,jY,H2,YJ,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,XI,hs,yp,ug,DT,OB,DO,p8,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+function Zt(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
+this.AP=AP
+this.fn=fn
+this.AP=AP
+this.fn=fn
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Zt.builtin$cls="Zt"
+if(!"name" in Zt)Zt.name="Zt"
+$desc=$collectedClasses.Zt
+if($desc instanceof Array)$desc=$desc[1]
+Zt.prototype=$desc
+Zt.prototype.gJh=function(receiver){return receiver.Jh}
+Zt.prototype.gJh.$reflectable=1
+Zt.prototype.sJh=function(receiver,v){return receiver.Jh=v}
+Zt.prototype.sJh.$reflectable=1
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
+if($desc instanceof Array)$desc=$desc[1]
+Dsd.prototype=$desc
+return[qE,pa,Gh,A0,na,Mr,zx,P2,Xk,W2,it,Az,QP,QW,jr,Ny,Zv,Yr,BR,di,d7,yJ,He,vz,vHT,n0,Em,pt,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,Aa,u5,Tq,W4,jP,Cz,tA,wa,Uq,QH,Rt,X2,zU,rk,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,fJ,BK,Rv,HO,Kk,ZY,Hy,EeC,Qb,Vu,xe,Hw,bn,Imr,Ve,CX,H9,FI,oU,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,FH,SN,HD,ni,jg,qj,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,CY,Wt,uaa,Hd,Ul,G5,bk,Lx,Er,qk,GI,Tb,tV,KP,yY,kJ,AE,xV,Dn,y6,RH,pU,OJ,Qa,dp,vw,aG,J6,u9,Bn,hq,UL,tZ,kc,AK,ty,Nf,F2,nL,QV,q0,Q7,hF,OF,Dh,Ue,mU,NE,lC,y5,jQ,mT,ui,mk,DQ,Sm,LM,es,eG,bd,pf,NV,W1,mCz,wf,n5,bb,Ic,lc,Xu,qM,tk,me,oB,nh,EI,MI,Ub,kK,eW,um,Fu,QN,N9,BA,d0,zp,br,PIw,vd,uzr,Yd,kN,lZ,Gr,XE,mO,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,tL,pyk,ZD,rD,wD,Wv,yz,Fi,Ja,mj,cB,uY,yR,GK,xJ,Nn,Et,NC,nb,Zn,xt,VJ,P0,xlX,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,Eb,dT,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,qa,BQ,O,PK,JO,f0,aX,cC,RA,IY,JH,jl,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,oo,OW,Dd,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,bw,WT,jJ,XR,LI,A2,IW,F3,FD,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,dN,GT,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,bv,eS,IQ,TI,at,wu,Vc,KQ,dZ,Qe,GH,Q4,WAE,N8,Vi,kx,fx,CM,xn,vu,c2,rj,af,SI,Y2,XN,No,PG,YW,BO,Yu,y2,Hq,Pl,XK,ho,G6,Ur,j3,i0,Tg,Ps,KU,RI,Ye,CN,HT,qbd,E0,Ds,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,H6,wB,U1,SJ,SU7,Qr,w2Y,iK,GD,Sn,nI,TY,Lj,mb,am,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,U7,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,LO,dz,tK,OR,Bg,DL,b8,j7,ff,Ia,Zf,vs,da,xw,dm,rH,ZL,rq,RW,RT,jZ,FZ,OM,qh,tG,jv,LB,zn,lz,Rl,Jb,M4,Jp,h7,pr,eN,PI,uO,j4,i9,VV,Dy,lU,OC,UH,Z5,ii,ib,MO,O9,yU,nP,KA,Vo,qB,ez,ti,LV,DS,JF,ht,CR,Qk,v1y,uR,Q0,YR,fB,nO,t3,dq,lO,aY,zG,e4,JB,Id,WH,TF,K5,Cg,Hs,dv,pV,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,ey,xd,v6,db,i5,N6,Rr,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,vX,Ba,An,bF,LD,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,wI,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Rz,iP,MF,Rq,Hn,Zl,B5,a6,P7,DW,Ge,LK,AT,bJ,Np,mp,ub,ds,lj,UV,VS,t7,HG,aE,eV,kM,EH,cX,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hb,XX,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,ecX,kI,yoo,w1p,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,hP,Gm,Of,Qg,W9,vZ,dW,Dk,O7,IU,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,ac,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ob,Ip,Pg,Nb,nA,Fv,pv,E9,Vfx,m8,Gk,Urj,e5,Ni,AX,yb,oub,QR,Yx,NM,c4r,nx,jm,xj,VB,aI,rG,yh,wO,Tm,q1,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,fM,hx,Squ,PO,Vf,u7,fW,Ey,qm,vO,E7,KUl,SV,Mf,Kz,vj,tuj,LU,T2,mHk,Jq,Yn,TJ,dG,qV,HV,em,Lb,PF,Vct,fA,Qz,jA,Jo,c5,F1,aQ,D13,Ya5,WZq,Ww,pva,tz,cda,fl,qFb,oM,rna,wM,Vba,lI,waa,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,Ay,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,YJ,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w10,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,Bl,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,G0,mY,GX,mB,XF,bX,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w9,c4,z6,Ay0,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,mG,uA,vl,Li,WK,iT,ja,zw,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,cfS,JG,V0,knI,T5,fI,oaa,qq,FC,xI,Sq,nm,q2,uwf,q3,At,Sb,V2,BT,jY,H2,DO,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,XI,hs,yp,ug,DT,OB,lP,p8,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,wl,T4,TR,VD,Zt,Dsd]}
\ 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 5ed394e..45ad494 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -13,6 +13,9 @@
 <body><polymer-element name="observatory-element">
   
 </polymer-element>
+<polymer-element name="isolate-element" extends="observatory-element">
+  
+</polymer-element>
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
     <style>
@@ -168,41 +171,40 @@
   </template>
 </polymer-element>
 
-<polymer-element name="isolate-nav-menu" extends="observatory-element">
+<polymer-element name="isolate-nav-menu" extends="isolate-element">
   <template>
     <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.hashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="library-nav-menu" extends="observatory-element">
+<polymer-element name="library-nav-menu" extends="isolate-element">
   <template>
-    <nav-menu link="{{ app.locationManager.currentIsolateRelativeLink(library['id']) }}" anchor="{{ library['name'] }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink(library['id']) }}" anchor="{{ library['name'] }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="class-nav-menu" extends="observatory-element">
+<polymer-element name="class-nav-menu" extends="isolate-element">
   <template>
-    <nav-menu link="{{ app.locationManager.currentIsolateRelativeLink(cls['id']) }}" anchor="{{ cls['user_name'] }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink(cls['id']) }}" anchor="{{ cls['user_name'] }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
 
-<polymer-element name="breakpoint-list" extends="observatory-element">
+<polymer-element name="breakpoint-list" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -224,7 +226,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="service-ref" extends="observatory-element">
+<polymer-element name="service-ref" extends="isolate-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
 <template>
@@ -318,7 +320,7 @@
       </template>
 
       <template if="{{ isNullRef(ref['type']) }}">
-        {{ name }}
+        <div title="{{ hoverText }}">{{ name }}</div>
       </template>
 
       <template if="{{ (isStringRef(ref['type']) ||
@@ -340,7 +342,7 @@
             <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
               <td class="member">{{ field['decl']['user_name'] }}</td>
               <td class="member">
-                <instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -354,7 +356,7 @@
             <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
               <td class="member">[{{ element['index']}}]</td>
               <td class="member">
-                <instance-ref app="{{ app }}" ref="{{ element['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ element['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -370,14 +372,13 @@
   <a href="{{ url }}">{{ name }}</a>
 </template>
 
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
+</polymer-element><polymer-element name="class-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <library-nav-menu app="{{ app }}" library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu app="{{ app }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <library-nav-menu isolate="{{ isolate }}" library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu isolate="{{ isolate }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -467,12 +468,11 @@
   </div>
   </template>
   
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
+</polymer-element><polymer-element name="code-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="{{ code.functionRef['user_name'] }}" last="{{ true }}"></nav-menu>
       <!-- TODO(turnidge): Implement code refresh -->
     </nav-bar>
@@ -481,7 +481,7 @@
     <div class="col-md-8 col-md-offset-2">
       <div class="{{ cssPanelClass }}">
         <div class="panel-heading">
-          <function-ref app="{{ app }}" ref="{{ code.functionRef }}"></function-ref>
+          <function-ref isolate="{{ isolate }}" ref="{{ code.functionRef }}"></function-ref>
         </div>
         <div class="panel-body">
           <div class="row">
@@ -512,18 +512,17 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="field-view" extends="observatory-element">
+</polymer-element><polymer-element name="field-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <template if="{{ field['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu app="{{ app }}" cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu isolate="{{ isolate }}" cls="{{ field['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ field['owner']['type'] == '@Library' }}">
-        <library-nav-menu app="{{ app }}" library="{{ field['owner'] }}"></library-nav-menu>
+        <library-nav-menu isolate="{{ isolate }}" library="{{ field['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -537,7 +536,7 @@
           <template if="{{ field['final'] }}">final</template>
           <template if="{{ field['const'] }}">const</template>
           {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref app="{{ app }}" ref="{{ field['class'] }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ field['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
         <template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -556,7 +555,7 @@
             </div>
           </template>
           <blockquote>
-            <class-ref app="{{ app }}" ref="{{ field['guard_class'] }}"></class-ref>
+            <class-ref isolate="{{ isolate }}" ref="{{ field['guard_class'] }}"></class-ref>
           </blockquote>
         </template>
         </div>
@@ -566,18 +565,17 @@
   </template>
   
 </polymer-element>
-<polymer-element name="function-view" extends="observatory-element">
+<polymer-element name="function-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <template if="{{ function['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu app="{{ app }}" cls="{{ function['owner'] }}"></class-nav-menu>
+        <class-nav-menu isolate="{{ isolate }}" cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ function['owner']['type'] == '@Library' }}">
-        <library-nav-menu app="{{ app }}" library="{{ function['owner'] }}"></library-nav-menu>
+        <library-nav-menu isolate="{{ isolate }}" library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -588,12 +586,12 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
           {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref app="{{ app }}" ref="{{ function['class'] }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ function['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <div>
-          <code-ref app="{{ app }}" ref="{{ function['code'] }}"></code-ref>
-          <code-ref app="{{ app }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
+          <code-ref isolate="{{ isolate }}" ref="{{ function['code'] }}"></code-ref>
+          <code-ref isolate="{{ isolate }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
           </div>
           <table class="table table-hover">
             <tbody>
@@ -636,7 +634,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="isolate-summary" extends="observatory-element">
+<polymer-element name="isolate-summary" extends="isolate-element">
   <template>
     <div class="row">
       <div class="col-md-1">
@@ -650,7 +648,7 @@
 
         <div class="row">
           <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ app.locationManager.relativeLink(isolate.id, isolate.entry['id']) }}">
+            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
               {{ isolate.name }}
             </a>
           </template>
@@ -661,9 +659,9 @@
 
         <div class="row">
           <small>
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, isolate.rootLib) }}">library</a>)
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, 'debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, 'profile') }}">profile</a>)
+            (<a href="{{ isolate.hashLink(isolate.rootLib) }}">library</a>)
+            (<a href="{{ isolate.hashLink('debug/breakpoints') }}">breakpoints</a>)
+            (<a href="{{ isolate.hashLink('profile') }}">profile</a>)
           </small>
         </div>
       </div>
@@ -696,7 +694,7 @@
         </div>
       </div>
       <div class="col-md-2">
-        <a href="{{ app.locationManager.relativeLink(isolate.id, 'allocationprofile') }}">
+        <a href="{{ isolate.hashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
       </div>
@@ -707,7 +705,7 @@
         <template if="{{ isolate.topFrame != null }}">
           run
         </template>
-        ( <a href="{{ app.locationManager.relativeLink(isolate.id, 'stacktrace') }}">stack trace</a> )
+        ( <a href="{{ isolate.hashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
     <div class="row">
@@ -715,8 +713,8 @@
       </div>
       <div class="col-md-6">
         <template if="{{ isolate.topFrame != null }}">
-          <function-ref app="{{ app }}" isolate="{{ isolate }}" ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref app="{{ app }}" isolate="{{ isolate }}" ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+          <function-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['function'] }}"></function-ref>
+          (<script-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
           <br>
           <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
         </template>
@@ -727,7 +725,10 @@
   </template>
   
 </polymer-element>
-<polymer-element name="isolate-list" extends="observatory-element">
+<polymer-element name="vm-element" extends="observatory-element">
+  
+</polymer-element>
+<polymer-element name="isolate-list" extends="vm-element">
   <template>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -735,24 +736,22 @@
       <nav-refresh callback="{{ refresh } }}"></nav-refresh>
     </nav-bar>
       <ul class="list-group">
-      <template repeat="{{ isolate in app.isolateManager.isolates.values }}">
+      <template repeat="{{ isolate in vm.isolates.values }}">
       	<li class="list-group-item">
-        <isolate-summary app="{{ app }}" isolate="{{ isolate }}"></isolate-summary>
+        <isolate-summary isolate="{{ isolate }}"></isolate-summary>
         </li>
       </template>
       </ul>
-      (<a href="{{ app.locationManager.absoluteLink('cpu') }}">cpu</a>)
   </template>
   
 </polymer-element>
-<polymer-element name="instance-view" extends="observatory-element">
+<polymer-element name="instance-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <!-- TODO(turnidge): Add library nav menu here. -->
-      <class-nav-menu app="{{ app }}" cls="{{ instance['class'] }}"></class-nav-menu>
+      <class-nav-menu isolate="{{ isolate }}" cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
       <!-- TODO(turnidge): Add nav refresh here. -->
     </nav-bar>
@@ -762,7 +761,7 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
          Instance of
-         <class-ref app="{{ app }}" ref="{{ instance['class'] }}"></class-ref>
+         <class-ref isolate="{{ isolate }}" ref="{{ instance['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <template if="{{ instance['error'] == null }}">
@@ -777,8 +776,8 @@
             <table class="table table-hover">
              <tbody>
                 <tr template="" repeat="{{ field in instance['fields'] }}">
-                  <td><field-ref app="{{ app }}" ref="{{ field['decl'] }}"></field-ref></td>
-                  <td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
+                  <td><field-ref isolate="{{ isolate }}" ref="{{ field['decl'] }}"></field-ref></td>
+                  <td><instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -823,13 +822,12 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-view" extends="observatory-element">
+<polymer-element name="library-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <library-nav-menu app="{{ app }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <library-nav-menu isolate="{{ isolate }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -841,7 +839,7 @@
           {{ script['kind'] }}
         </td>
         <td>
-          <script-ref app="{{ app }}" ref="{{ script }}"></script-ref>
+          <script-ref isolate="{{ isolate }}" ref="{{ script }}"></script-ref>
         </td>
       </tr>
     </tbody>
@@ -851,7 +849,7 @@
     <tbody>
       <tr template="" repeat="{{ lib in library['libraries'] }}">
         <td>
-          <library-ref app="{{ app }}" ref="{{ lib }}"></library-ref>
+          <library-ref isolate="{{ isolate }}" ref="{{ lib }}"></library-ref>
         </td>
       </tr>
     </tbody>
@@ -860,8 +858,8 @@
   <table class="table table-hover">
     <tbody>
       <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref app="{{ app }}" ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref app="{{ app }}" ref="{{ variable['value'] }}"></instance-ref></td>
+        <td><field-ref isolate="{{ isolate }}" ref="{{ variable }}"></field-ref></td>
+        <td><instance-ref isolate="{{ isolate }}" ref="{{ variable['value'] }}"></instance-ref></td>
       </tr>
     </tbody>
   </table>
@@ -870,7 +868,7 @@
     <tbody>
       <tr template="" repeat="{{ func in library['functions'] }}">
         <td>
-          <function-ref app="{{ app }}" ref="{{ func }}"></function-ref>
+          <function-ref isolate="{{ isolate }}" ref="{{ func }}"></function-ref>
         </td>
       </tr>
     </tbody>
@@ -886,10 +884,10 @@
     <tbody>
       <tr template="" repeat="{{ cls in library['classes'] }}">
         <td>
-          <class-ref app="{{ app }}" ref="{{ cls }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ cls }}"></class-ref>
         </td>
         <td>
-          <class-ref app="{{ app }}" ref="{{ cls }}" internal=""></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ cls }}" internal=""></class-ref>
         </td>
       </tr>
     </tbody>
@@ -898,12 +896,11 @@
   </template>
   
 </polymer-element>
-<polymer-element name="heap-profile" extends="observatory-element">
+<polymer-element name="heap-profile" extends="isolate-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-    </isolate-nav-menu>
+    <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
     <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
@@ -966,13 +963,58 @@
 </template>
 
 </polymer-element>
-<polymer-element name="script-view" extends="observatory-element">
+<polymer-element name="isolate-profile" extends="isolate-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <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>
+        <tr>
+          <th>Method</th>
+          <th>Exclusive</th>
+          <th>Caller</th>
+          <th>Inclusive</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+            <code-ref isolate="{{ isolate }}" ref="{{ row.code.codeRef }}"></code-ref>
+          </td>
+          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
+        </tr>
+      </tbody>
+    </table>
+  </template>
+  
+</polymer-element>
+<polymer-element name="script-view" extends="isolate-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
+    <isolate-nav-menu isolate="{{ isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu app="{{ app }}" library="{{ script.libraryRef }}"></library-nav-menu>
+    <library-nav-menu isolate="{{ isolate }}" library="{{ script.libraryRef }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.shortName }}" last="{{ true }}"></nav-menu>
   </nav-bar>
 
@@ -999,7 +1041,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="stack-frame" extends="observatory-element">
+<polymer-element name="stack-frame" extends="isolate-element">
   <template>
     <style>
       .member {
@@ -1013,15 +1055,15 @@
         #{{ frame['depth'] }}
       </div>
       <div class="col-md-9">
-        <function-ref app="{{ app }}" ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref app="{{ app }}" ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        <function-ref isolate="{{ isolate }}" ref="{{ frame['function'] }}"></function-ref>
+        ( <script-ref isolate="{{ isolate }}" 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 app="{{ app }}" ref="{{ v['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ v['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -1035,12 +1077,11 @@
   </template>
   
 </polymer-element>
-<polymer-element name="stack-trace" extends="observatory-element">
+<polymer-element name="stack-trace" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -1055,7 +1096,7 @@
       <ul class="list-group">
         <template repeat="{{ frame in trace['members'] }}">
           <li class="list-group-item">
-            <stack-frame app="{{ app }}" frame="{{ frame }}"></stack-frame>
+            <stack-frame isolate="{{ isolate }}" frame="{{ frame }}"></stack-frame>
           </li>
         </template>
       </ul>
@@ -1071,122 +1112,75 @@
   <template>
   	<!-- If the message type is an IsolateList -->
     <template if="{{ messageType == 'IsolateList' }}">
-      <isolate-list app="{{ app }}"></isolate-list>
+      <isolate-list vm="{{ app.vm }}"></isolate-list>
     </template>
     <!-- If the message type is a StackTrace -->
     <template if="{{ messageType == 'StackTrace' }}">
-      <stack-trace app="{{ app }}" trace="{{ message }}"></stack-trace>
+      <stack-trace isolate="{{ app.isolate }}" trace="{{ message }}"></stack-trace>
     </template>
     <template if="{{ messageType == 'BreakpointList' }}">
-      <breakpoint-list app="{{ app }}" msg="{{ message }}"></breakpoint-list>
+      <breakpoint-list isolate="{{ app.isolate }}" msg="{{ message }}"></breakpoint-list>
     </template>
     <template if="{{ messageType == 'Error' }}">
-      <error-view app="{{ app }}" error="{{ message }}"></error-view>
+      <error-view isolate="{{ app.isolate }}" error="{{ message }}"></error-view>
     </template>
     <template if="{{ messageType == 'Library' }}">
-      <library-view app="{{ app }}" library="{{ message }}"></library-view>
+      <library-view isolate="{{ app.isolate }}" library="{{ message }}"></library-view>
     </template>
     <template if="{{ messageType == 'Class' }}">
-      <class-view app="{{ app }}" cls="{{ message }}"></class-view>
+      <class-view isolate="{{ app.isolate }}" cls="{{ message }}"></class-view>
     </template>
     <template if="{{ messageType == 'Field' }}">
-      <field-view app="{{ app }}" field="{{ message }}"></field-view>
+      <field-view isolate="{{ app.isolate }}" field="{{ message }}"></field-view>
     </template>
     <template if="{{ messageType == 'Closure' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Instance' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Array' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'GrowableObjectArray' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'String' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Bool' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Smi' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
     </template>
     <template if="{{ messageType == 'Function' }}">
-      <function-view app="{{ app }}" function="{{ message }}"></function-view>
+      <function-view isolate="{{ app.isolate }}" function="{{ message }}"></function-view>
     </template>
     <template if="{{ messageType == 'Code' }}">
-      <code-view app="{{ app }}" code="{{ message['code'] }}"></code-view>
+      <code-view isolate="{{ app.isolate }}" code="{{ message['code'] }}"></code-view>
     </template>
     <template if="{{ messageType == 'Script' }}">
-      <script-view app="{{ app }}" script="{{ message['script'] }}"></script-view>
+      <script-view isolate="{{ app.isolate }}" script="{{ message['script'] }}"></script-view>
     </template>
     <template if="{{ messageType == 'AllocationProfile' }}">
-      <heap-profile app="{{ app }}" profile="{{ message }}"></heap-profile>
+      <heap-profile isolate="{{ app.isolate }}" profile="{{ message }}"></heap-profile>
     </template>
-    <template if="{{ messageType == 'CPU' }}">
-      <json-view json="{{ message }}"></json-view>
+    <template if="{{ messageType == 'Profile' }}">
+      <isolate-profile isolate="{{ app.isolate }}" profile="{{ message }}"></isolate-profile>
     </template>
     <!-- Add new views and message types in the future here. -->
   </template>
   
 </polymer-element>
-<polymer-element name="isolate-profile" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-
-    <div>
-      <span>Top</span>
-      <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-        <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-      </select>
-      <span>exclusive methods</span>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
-        <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
-          <th>Inclusive</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref app="{{ app }}" ref="{{ row.code.codeRef }}"></code-ref>
-          </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
-        </tr>
-      </tbody>
-    </table>
-  </template>
-  
-</polymer-element>
 <polymer-element name="response-viewer" extends="observatory-element">
   <template>
-    <template repeat="{{ message in app.requestManager.responses }}">
-      <message-viewer app="{{ app }}" message="{{ message }}"></message-viewer>
-    </template>
+    <message-viewer app="{{ app }}" message="{{ app.response }}"></message-viewer>
   </template>
   
 </polymer-element><polymer-element name="observatory-application" extends="observatory-element">
   <template>
-    <template if="{{ app.locationManager.profile }}">
-      <isolate-profile app="{{ app }}"></isolate-profile>
-    </template>
-    <template if="{{ app.locationManager.profile == false }}">
-      <response-viewer app="{{ app }}"></response-viewer>
-    </template>
+    <response-viewer app="{{ app }}"></response-viewer>
   </template>
   
 </polymer-element>
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 3b22d34..a8bb6e0 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
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAp:"__$library",gAu:"__$cls",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDF:"requestManager",gF0:"__$cls",gF8:"__$instruction",gGQ:"_newPieDataTable",gGV:"__$expanded",gGj:"_message",gHX:"__$displayValue",gHm:"tree",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",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:"__$trace",gVa:"__$frame",gWT:"rows",gX3:"_first",gXR:"scripts",gXh:"__$instance",gYu:"address",gZ0:"codes",gZ6:"locationManager",gZ8:"__$function",gZC:"__$anchor",ga:"a",gb:"b",gbV:"_combinedDataTable",gc:"c",geJ:"__$code",geb:"__$json",gfb:"methodCounts",ghm:"__$app",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkf:"_count",gm0:"__$isolate",gm7:"machine",gnI:"isolateManager",gnx:"__$callback",goH:"columns",gq3:"_fullChart",gqO:"_id",gqY:"__$topExclusiveCodes",grU:"__$callback",gtT:"code",gtY:"__$ref",gvH:"index",gvR:"_combinedChart",gva:"instructions",gvt:"__$field",gwd:"children",gyt:"depth",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",pC:"ACCUMULATED",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
+;init.mangledNames={gAp:"__$library",gAu:"__$cls",gBW:"__$msg",gCO:"_oldPieChart",gF0:"__$cls",gGQ:"_newPieDataTable",gGV:"__$expanded",gGj:"_message",gHX:"__$displayValue",gHm:"tree",gHu:"__$busy",gJ0:"_newPieChart",gJh:"__$vm",gJo:"__$last",gKM:"$",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPy:"__$error",gRd:"line",gSB:"__$active",gSS:"__$methodCountSelected",gSw:"lines",gUp:"__$trace",gUy:"_collapsed",gUz:"__$script",gVa:"__$frame",gWT:"rows",gX3:"_first",gXR:"scripts",gXh:"__$instance",gYu:"address",gZ0:"codes",gZ6:"locationManager",gZ8:"__$function",gZC:"__$anchor",ga:"a",gah:"__$app",gb:"b",gbV:"_combinedDataTable",geH:"__$sampleCount",geJ:"__$code",geb:"__$json",gfb:"methodCounts",gi2:"isolates",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm0:"__$instruction",gm7:"machine",gnx:"__$callback",goH:"columns",gpC:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqY:"__$topExclusiveCodes",grU:"__$callback",gtT:"code",gtY:"__$ref",guy:"__$link",gvH:"index",gva:"instructions",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={DI:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",b7:"ALLOCATED_BEFORE_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",pC:"ACCUMULATED",r1K:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8825,7 +8825,7 @@
 if(typeof z!=="number")return z.g()
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"call$1","Tj",2,0,null,11,[]],
+return y[x]},"call$1","eh",2,0,null,11,[]],
 Nq:[function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
@@ -8839,7 +8839,7 @@
 n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,104,[]],
 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,328,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 $isGv:true,
 "%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
@@ -8876,21 +8876,21 @@
 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","gRI",2,0,null,124,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,110,[]],
+return!0}return!1},"call$1","gRI",2,0,null,129,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,115,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,329,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,332,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,110,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,110,[]],
+aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,115,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
 zV:[function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
 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","gnr",0,2,null,330,331,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,289,[]],
+y[x]=w}return y.join(b)},"call$1","gnr",0,2,null,333,334,[]],
+eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,292,[]],
 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,47,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
@@ -8898,9 +8898,9 @@
 if(c==null)c=a.length
 else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(new P.AT(c))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,115,[],116,[]],
+return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
 Mu:[function(a,b,c){H.K0(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,115,[],116,[]],
+return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
@@ -8916,12 +8916,12 @@
 if(typeof c!=="number")return H.s(c)
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
-this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,115,[],116,[]],
-Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,110,[]],
+this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,120,[],121,[]],
+Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,115,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.ZE(a,0,a.length-1,b)},"call$1","gH7",0,2,null,77,128,[]],
-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,124,[],115,[]],
-Pk:[function(a,b,c){return H.eX(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,124,[],115,[]],
+H.ZE(a,0,a.length-1,b)},"call$1","gH7",0,2,null,77,133,[]],
+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,335,129,[],120,[]],
+Pk:[function(a,b,c){return H.eX(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
 return!1},"call$1","gdj",2,0,null,104,[]],
@@ -8932,7 +8932,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,"gRV",0,3,null,336,337,[]],
 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},
@@ -8976,11 +8976,11 @@
 if(this.gzP(a)===z)return 0
 if(this.gzP(a))return-1
 return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},"call$1","gYc",2,0,null,183,[]],
+return 1}else return-1},"call$1","gYc",2,0,null,188,[]],
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
 gx8:function(a){return isFinite(a)},
-JV:[function(a,b){return a%b},"call$1","gKG",2,0,null,183,[]],
+JV:[function(a,b){return a%b},"call$1","gKG",2,0,null,188,[]],
 yu:[function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
@@ -8992,7 +8992,7 @@
 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,338,[]],
 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,28,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
@@ -9013,7 +9013,7 @@
 if(b<0)return z-b
 else return z+b},"call$1","gQR",2,0,null,104,[]],
 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","gdG",2,0,null,104,[]],
+else return this.yu(a/b)},"call$1","guP",2,0,null,104,[]],
 cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,104,[]],
 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,104,[]],
@@ -9029,6 +9029,8 @@
 z=a>>z>>>0}return z},"call$1","gMe",2,0,null,104,[]],
 i:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return(a&b)>>>0},"call$1","gAU",2,0,null,104,[]],
+k:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return(a|b)>>>0},"call$1","gX9",2,0,null,104,[]],
 w:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return(a^b)>>>0},"call$1","gttE",2,0,null,104,[]],
 C:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -9054,17 +9056,17 @@
 $isnum:true},
 vT:{
 "^":"im;"},
-VP:{
+qa:{
 "^":"vT;"},
 BQ:{
-"^":"VP;"},
+"^":"qa;"},
 O:{
 "^":"String/Gv;",
 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,47,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,339,[]],
 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 +9077,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,26,[],115,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,335,26,[],120,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},"call$1","gF1n",2,0,null,104,[]],
 Tc:[function(a,b){var z,y
@@ -9083,13 +9085,13 @@
 y=a.length
 if(z>y)return!1
 return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,104,[]],
-h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gpd",4,0,null,105,[],106,[]],
+h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,105,[],106,[]],
 Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,98,[]],
 Qi:[function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string"){z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)}return J.I8(b,a,c)!=null},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,98,[],47,[]],
+return b===a.substring(c,z)}return J.I8(b,a,c)!=null},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,335,98,[],47,[]],
 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
@@ -9098,7 +9100,7 @@
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
 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,77,80,[],125,[]],
+return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,77,80,[],130,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
 bS:[function(a){var z,y,x,w,v
 for(z=a.length,y=0;y<z;){if(y>=z)H.vh(P.N(y))
@@ -9118,7 +9120,7 @@
 z=J.rY(b)
 if(typeof b==="object"&&b!==null&&!!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,98,[],115,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,98,[],120,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9129,10 +9131,10 @@
 x=c
 while(!0){if(typeof x!=="number")return x.F()
 if(!(x>=0))break
-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,"gph",2,2,null,77,98,[],115,[]],
+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,"gph",2,2,null,77,98,[],120,[]],
 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,104,[],80,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,335,104,[],80,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
@@ -9186,7 +9188,7 @@
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.ZV()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-return},"call$0","DU",0,0,null],
+return},"call$0","dY",0,0,null],
 ZV:[function(){var z,y
 z=new Error().stack
 if(z==null){z=(function() {try { throw new Error() } catch(e) { return e.stack }})()
@@ -9268,11 +9270,11 @@
 VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,21,[]],
 ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,21,[]],
 PK:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){this.a.call$1([])},"call$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:108;b",
+"^":"Tp:113;b",
 call$0:[function(){this.b.call$2([],null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
@@ -9297,7 +9299,7 @@
 aX:{
 "^":"a;jO>,Gx,fW,En<,EE<,Qy,RW<,C9<,lJ",
 v8:[function(a,b){if(!this.Qy.n(0,a))return
-if(this.lJ.h(0,b)&&!this.RW)this.RW=!0},"call$2","gfU",4,0,null,337,[],338,[]],
+if(this.lJ.h(0,b)&&!this.RW)this.RW=!0},"call$2","gfU",4,0,null,340,[],341,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9313,24 +9315,24 @@
 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}},"call$1","gtS",2,0,null,338,[]],
+y.qT=y.qT+1}this.RW=!1}},"call$1","gtS",2,0,null,341,[]],
 vV:[function(a){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
 try{y=a.call$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,136,[]],
+if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,141,[]],
 Ds:[function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
 default:P.JS("UNKOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,20,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,339,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,342,[]],
 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,339,[],340,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,342,[],343,[]],
 PC:[function(){var z=this.jO
 if(this.Gx.X5-this.fW.X5>0)init.globalState.i2.u(0,z,this)
 else init.globalState.i2.Rz(0,z)},"call$0","gi8",0,0,null],
@@ -9357,12 +9359,12 @@
 x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
-return!0},"call$0","gUB",0,0,null],
-Js:[function(){if($.Qm()!=null)new H.RA(this).call$0()
+return!0},"call$0","gad",0,0,null],
+oV:[function(){if($.Qm()!=null)new H.RA(this).call$0()
 else for(;this.xB(););},"call$0","gVY",0,0,null],
 bL:[function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.Js()
-else try{this.Js()}catch(x){w=H.Ru(x)
+if(init.globalState.EF!==!0)this.oV()
+else try{this.oV()}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 w=init.globalState.vd
@@ -9370,19 +9372,19 @@
 w.toString
 self.postMessage(v)}},"call$0","gcP",0,0,null]},
 RA:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;Aq*,i3,G1*",
 VU:[function(){if(this.Aq.gRW()){this.Aq.gC9().push(this)
-return}this.Aq.vV(this.i3)},"call$0","gjF",0,0,null],
+return}this.Aq.vV(this.i3)},"call$0","gbF",0,0,null],
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:108;a,b,c,d,e",
+"^":"Tp:113;a,b,c,d,e",
 call$0:[function(){var z,y,x,w,v,u
 z=this.a
 y=this.b
@@ -9427,7 +9429,7 @@
 $isZ6:true,
 $isbC:true},
 Ua:{
-"^":"Tp:108;a,b,c",
+"^":"Tp:113;a,b,c",
 call$0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -9465,11 +9467,11 @@
 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,341,[]],
+this.wy(b)},"call$1","gT5",2,0,null,344,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
-"^":"hz;CN,il",
+"^":"Dd;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,21,[]],
@@ -9499,7 +9501,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,[],342,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],345,[]],
 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
@@ -9508,7 +9510,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,[],342,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],345,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
 Xq:[function(){return},"call$0","gt6",0,0,null]},
 HU:{
@@ -9525,8 +9527,8 @@
 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.$isIU)return this.yf(a)
-return this.I9(a)},"call$1","gRQ",2,0,null,21,[]],
-I9:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,21,[]]},
+return this.YZ(a)},"call$1","gRQ",2,0,null,21,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,21,[]]},
 oo:{
 "^":"HU;",
 Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
@@ -9551,15 +9553,15 @@
 z.a=y
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
-return z.a},"call$1","gnM",2,0,null,144,[]],
+return z.a},"call$1","gnM",2,0,null,149,[]],
 DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,21,[]],
 yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,21,[]]},
 OW:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;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,42,[],204,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,42,[],211,[],"call"],
 $isEH:true},
-hz:{
+Dd:{
 "^":"HU;",
 Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
 wb:[function(a){var z,y
@@ -9575,7 +9577,7 @@
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,144,[]],
+return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,149,[]],
 mE:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
@@ -9628,7 +9630,7 @@
 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,21,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gec",2,0,null,21,[]]},
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,21,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
 ed:[function(){var z,y,x
@@ -9656,12 +9658,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:107;a,b",
+"^":"Tp:112;a,b",
 call$0:[function(){this.a.p9=null
 this.b.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:107;c,d",
+"^":"Tp:112;c,d",
 call$0:[function(){this.c.p9=null
 var z=init.globalState.Xz
 z.bZ=z.bZ-1
@@ -10234,7 +10236,7 @@
 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,42,[],204,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,42,[],211,[]],
 Rz:[function(a,b){return this.Ix()},"call$1","gRI",2,0,null,42,[]],
 V1:[function(a){return this.Ix()},"call$0","gyP",0,0,null],
 FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,104,[]],
@@ -10248,7 +10250,7 @@
 t:[function(a,b){if(typeof b!=="string")return
 if(!this.x4(b))return
 return this.HV[b]},"call$1","gIA",2,0,null,42,[]],
-aN:[function(a,b){J.kH(this.tc,new H.WT(this,b))},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){J.kH(this.tc,new H.WT(this,b))},"call$1","gjw",2,0,null,115,[]],
 gvc:function(a){return H.VM(new H.XR(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
@@ -10258,11 +10260,11 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 WT:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;a,b",
 call$1:[function(a){return this.b.call$2(a,this.a.t(0,a))},"call$1",null,2,0,null,42,[],"call"],
 $isEH:true},
 jJ:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,42,[],"call"],
 $isEH:true},
 XR:{
@@ -10332,7 +10334,7 @@
 C.Nm.FV(y,b)
 z=this.Ot
 z=z!=null?z:a
-b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,140,[],82,[]]},
+b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
 IW:{
 "^":"A2;qa,Pi,mr,eK,Ot",
 To:function(a){return this.qa.call$1(a)},
@@ -10351,25 +10353,25 @@
 else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
 else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
 for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)},"call$2","gUT",4,0,null,140,[],82,[]]},
+return this.mr.apply(v,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
 F3:{
-"^":"a;e0?",
+"^":"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,140,[],328,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,145,[],331,[]]},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM",
 BX:[function(a,b){var z=this.Rv
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,344,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,347,[]],
 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,345,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,348,[]],
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"t4,FV,C1,bt",zh:function(a){var z,y,x,w
+static:{"^":"t4,FV,C1,kj",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -10379,7 +10381,7 @@
 w=z[1]
 return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2])}}},
 Cj:{
-"^":"Tp:346;a,b,c",
+"^":"Tp:349;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
@@ -10387,10 +10389,10 @@
 z.a=z.a+1},"call$2",null,4,0,null,12,[],46,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:346;a,b",
+"^":"Tp:349;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,344,[],23,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,347,[],23,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10459,10 +10461,10 @@
 bu:[function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
-"^":"Tp:225;a",
+"^":"Tp:107;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
-return a},"call$1",null,2,0,null,155,[],"call"],
+return a},"call$1",null,2,0,null,160,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -10475,23 +10477,23 @@
 this.ui=z
 return z},"call$0","gXo",0,0,null]},
 dr:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return this.a.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:108;b,c",
+"^":"Tp:113;b,c",
 call$0:[function(){return this.b.call$1(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:108;d,e,f",
+"^":"Tp:113;d,e,f",
 call$0:[function(){return this.d.call$2(this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:108;UI,bK,Gq,Rm",
+"^":"Tp:113;UI,bK,Gq,Rm",
 call$0:[function(){return this.UI.call$3(this.bK,this.Gq,this.Rm)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:108;w3,HZ,mG,xC,cj",
+"^":"Tp:113;w3,HZ,mG,xC,cj",
 call$0:[function(){return this.w3.call$4(this.HZ,this.mG,this.xC,this.cj)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
@@ -10636,11 +10638,11 @@
 Lm:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:347;b",
+"^":"Tp:350;b",
 call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,91,[],94,[],"call"],
 $isEH:true},
 VX:{
@@ -10665,16 +10667,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,339,[]],
 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,339,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,339,[]],
 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,26,[],115,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,26,[],120,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10685,13 +10687,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,26,[],115,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,26,[],120,[]],
 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,26,[],115,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,335,26,[],120,[]],
 $isVR:true,
 $iscT:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10737,19 +10739,753 @@
 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,348,[]],
-$isOd:true}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+return this.zO},"call$1","gIA",2,0,null,351,[]],
+$isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/observatory_elements/observatory_element.dart","package:observatory/src/observatory_elements/nav_bar.dart","package:observatory/src/observatory_elements/breakpoint_list.dart","package:observatory/src/observatory_elements/service_ref.dart","package:observatory/src/observatory_elements/class_ref.dart","package:observatory/src/observatory_elements/error_view.dart","package:observatory/src/observatory_elements/field_ref.dart","package:observatory/src/observatory_elements/function_ref.dart","package:observatory/src/observatory_elements/curly_block.dart","package:observatory/src/observatory_elements/instance_ref.dart","package:observatory/src/observatory_elements/library_ref.dart","package:observatory/src/observatory_elements/class_view.dart","package:observatory/src/observatory_elements/code_ref.dart","package:observatory/src/observatory_elements/disassembly_entry.dart","package:observatory/src/observatory_elements/code_view.dart","package:observatory/src/observatory_elements/collapsible_content.dart","package:observatory/src/observatory_elements/field_view.dart","package:observatory/src/observatory_elements/function_view.dart","package:observatory/src/observatory_elements/script_ref.dart","package:observatory/src/observatory_elements/isolate_summary.dart","package:observatory/src/observatory_elements/isolate_list.dart","package:observatory/src/observatory_elements/instance_view.dart","package:observatory/src/observatory_elements/json_view.dart","package:observatory/src/observatory_elements/library_view.dart","package:observatory/src/observatory_elements/heap_profile.dart","package:observatory/src/observatory_elements/script_view.dart","package:observatory/src/observatory_elements/stack_frame.dart","package:observatory/src/observatory_elements/stack_trace.dart","package:observatory/src/observatory_elements/message_viewer.dart","package:observatory/src/observatory_elements/isolate_profile.dart","package:observatory/src/observatory_elements/response_viewer.dart","package:observatory/src/observatory_elements/observatory_application.dart","main.dart"]
+m7:[function(a){var z
+N.Jx("").To("Google Charts API loaded")
+z=J.UQ(J.UQ($.cM(),"google"),"visualization")
+$.NR=z
+return z},"call$1","vN",2,0,107,108,[]],
+js:[function(a,b){return J.pb(b,new G.BO(a))},"call$2","o4",4,0,null,110,[],111,[]],
+mL:{
+"^":["Pi;Z6<-352,zf>-353,AJ,Eb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gn9:[function(a){return this.AJ},null,null,1,0,354,"response",355,356],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,357,23,[],"response",355],
+gAq:[function(a){return this.Eb},null,null,1,0,358,"isolate",355,356],
+sAq:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,359,23,[],"isolate",355],
+Ww:[function(a,b){var z=H.B7(["type","Error","errorType",b,"text",a],P.L5(null,null,null,null,null))
+z=R.Jk(z)
+this.AJ=F.Wi(this,C.mE,this.AJ,z)
+N.Jx("").hh(a)},function(a){return this.Ww(a,"ResponseError")},"AI","call$2",null,"gug",2,2,null,360,20,[],361,[]],
+TR:[function(){this.zf.sec(this)
+var z=this.Z6
+z.sec(this)
+z.kI()},"call$0","gIo",0,0,null],
+US:function(){this.TR()},
+hq:function(){this.TR()},
+static:{"^":"Tj,pQ"}},
+Kf:{
+"^":"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,[],362,[]],
+lb:[function(){var z=this.Yb
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gGL",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,363,[]]},
+qu:{
+"^":"a;vR,bG>",
+u5:[function(){var z,y,x
+z=this.vR.nQ("getSortInfo")
+if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
+x=J.U6(z)
+y.u(0,"sortColumn",x.t(z,"column"))
+y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gIK",0,0,null],
+W2:[function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.gYb(),z])},"call$1","gW8",2,0,null,186,[]]},
+bv:{
+"^":["Pi;zf>,rI,we,jF,XR<-364,Z0<-365,hI,am,y6,c8,LE<-366,qU,yg,YG,jy,AP,fn",null,null,null,null,function(){return[C.mI]},function(){return[C.mI]},null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
+gAq:function(a){return this},
+gPj:function(a){return this.rI},
+gjO:function(a){return this.rI},
+zr:[function(a){return this.zf.Sl(this.rI).ml(new G.eS(this)).ml(new G.IQ(this))},"call$0","gvC",0,0,null],
+Mq:[function(a){return H.d(this.rI)+"/"+H.d(a)},"call$1","gLc",2,0,367,109,[],"relativeLink",355],
+rn:[function(a){return"#/"+(H.d(this.rI)+"/"+H.d(a))},"call$1","gHP",2,0,367,109,[],"hashLink",355],
+gB1:[function(a){return this.jF},null,null,1,0,368,"profile",355,356],
+sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,369,23,[],"profile",355],
+goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
+soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
+gzz:[function(){return this.am},null,null,1,0,370,"vmName",355,356],
+szz:[function(a){this.am=F.Wi(this,C.KS,this.am,a)},null,null,3,0,25,23,[],"vmName",355],
+gw2:[function(){return this.y6},null,null,1,0,354,"entry",355,356],
+sw2:[function(a){this.y6=F.Wi(this,C.tP,this.y6,a)},null,null,3,0,357,23,[],"entry",355],
+gVc:[function(){return this.c8},null,null,1,0,370,"rootLib",355,356],
+sVc:[function(a){this.c8=F.Wi(this,C.iF,this.c8,a)},null,null,3,0,25,23,[],"rootLib",355],
+gCi:[function(){return this.qU},null,null,1,0,371,"newHeapUsed",355,356],
+sCi:[function(a){this.qU=F.Wi(this,C.IO,this.qU,a)},null,null,3,0,372,23,[],"newHeapUsed",355],
+guq:[function(){return this.yg},null,null,1,0,371,"oldHeapUsed",355,356],
+suq:[function(a){this.yg=F.Wi(this,C.ap,this.yg,a)},null,null,3,0,372,23,[],"oldHeapUsed",355],
+gUu:[function(){return this.YG},null,null,1,0,354,"topFrame",355,356],
+sUu:[function(a){this.YG=F.Wi(this,C.ch,this.YG,a)},null,null,3,0,357,23,[],"topFrame",355],
+gNh:[function(a){return this.jy},null,null,1,0,370,"fileAndLine",355,356],
+bj:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.jy=F.Wi(this,C.SK,this.jy,b)},null,null,3,0,25,23,[],"fileAndLine",355],
+eC:[function(a){var z,y,x,w
+z=J.U6(a)
+if(!J.de(z.t(a,"type"),"Isolate")){N.Jx("").hh("Unexpected message type in Isolate.update: "+H.d(z.t(a,"type")))
+return}if(z.t(a,"rootLib")==null||z.t(a,"timers")==null||z.t(a,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(a))
+return}y=J.UQ(z.t(a,"rootLib"),"id")
+this.c8=F.Wi(this,C.iF,this.c8,y)
+y=z.t(a,"name")
+this.am=F.Wi(this,C.KS,this.am,y)
+if(z.t(a,"entry")!=null){y=z.t(a,"entry")
+y=F.Wi(this,C.tP,this.y6,y)
+this.y6=y
+y=J.UQ(y,"name")
+this.hI=F.Wi(this,C.YS,this.hI,y)}else this.hI=F.Wi(this,C.YS,this.hI,"root isolate")
+if(z.t(a,"topFrame")!=null){y=z.t(a,"topFrame")
+this.YG=F.Wi(this,C.ch,this.YG,y)}x=H.B7([],P.L5(null,null,null,null,null))
+J.kH(z.t(a,"timers"),new G.TI(x))
+y=this.LE
+w=J.w1(y)
+w.u(y,"total",x.t(0,"time_total_runtime"))
+w.u(y,"compile",x.t(0,"time_compilation"))
+w.u(y,"gc",0)
+w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
+w.u(y,"dart",x.t(0,"time_dart_execution"))
+y=J.UQ(z.t(a,"heap"),"usedNew")
+this.qU=F.Wi(this,C.IO,this.qU,y)
+z=J.UQ(z.t(a,"heap"),"usedOld")
+this.yg=F.Wi(this,C.ap,this.yg,z)},"call$1","gpn",2,0,null,149,[]],
+bu:[function(a){return H.d(this.rI)},"call$0","gXo",0,0,null],
+hv:[function(a){var z,y,x,w
+z=this.Z0
+y=J.U6(z)
+x=0
+while(!0){w=y.gB(z)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+if(J.kE(y.t(z,x),a)===!0)return y.t(z,x);++x}return},"call$1","gER",2,0,null,373,[]],
+R7:[function(){var z,y,x,w
+N.Jx("").To("Reset all code ticks.")
+z=this.Z0
+y=J.U6(z)
+x=0
+while(!0){w=y.gB(z)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+y.t(z,x).FB();++x}},"call$0","gve",0,0,null],
+oe:[function(a){var z,y,x,w,v,u,t
+for(z=J.GP(a),y=this.XR,x=J.U6(y);z.G();){w=z.gl()
+v=J.U6(w)
+u=J.UQ(v.t(w,"script"),"id")
+t=x.t(y,u)
+if(t==null){t=G.Ak(v.t(w,"script"))
+x.u(y,u,t)}t.hC(v.t(w,"hits"))}},"call$1","gHY",2,0,null,374,[]],
+tx:[function(a,b,c){var z,y,x
+z=H.B7(["type",a,b,c],P.L5(null,null,null,null,null))
+y=this.zf.ec
+y.toString
+x=R.Jk(z)
+y.AJ=F.Wi(y,C.mE,y.AJ,x)},"call$3","gmk",6,0,null,11,[],375,[],285,[]],
+XT:[function(a,b){var z,y,x
+z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isew){z=W.qc(a.target)
+y=J.RE(z)
+x=H.d(y.gys(z))+" "+y.gpo(z)
+if(y.gys(z)===0)x="No service found. Did you run with --enable-vm-service ?"
+this.zf.ec.Ww(x,"RequestError")}else this.zf.ec.AI(H.d(a)+" "+H.d(b))},"call$2","gdT",4,0,376,18,[],377,[]],
+n1:[function(a){var z,y,x
+z=G.Ep(a)
+y=J.x(z)
+if(y.n(z,0)){this.zf.ec.AI(a+" is not a valid code request.")
+return}x=this.hv(z)
+if(x!=null){N.Jx("").To("Found code with 0x"+y.WZ(z,16)+" in isolate.")
+this.tx("Code","code",x)
+return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.at(this,z)).OA(this.gdT())},"call$1","gN8",2,0,null,109,[]],
+PL:[function(a){var z,y
+z=J.UQ(this.XR,a)
+y=z!=null
+if(y&&!z.giI()){N.Jx("").To("Found script "+H.d(J.UQ(z.gKC(),"name"))+" in isolate")
+this.tx("Script","script",z)
+return}if(y){this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.wu(this,z))
+return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.Vc(this,a))},"call$1","gdk",2,0,null,109,[]],
+ox:[function(a){var z,y
+z=$.Ks().Ej
+y=typeof a!=="string"
+if(y)H.vh(new P.AT(a))
+if(z.test(a)){this.n1(a)
+return}z=$.hK().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a)){this.PL(a)
+return}return this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.KQ(this,a))},"call$1","gVw",2,0,null,109,[]],
+oX:[function(a){return this.zf.Sl(H.d(this.rI)+"/"+H.d(a))},"call$1","guZ",2,0,null,109,[]],
+$isd3:true,
+static:{"^":"rC,lF",Ep:[function(a){var z,y,x,w,v,u
+z=$.Ks().R4(0,a)
+if(z==null)return 0
+try{x=z.gQK().input
+w=z
+v=w.gQK().index
+w=w.gQK()
+if(0>=w.length)return H.e(w,0)
+w=J.q8(w[0])
+if(typeof w!=="number")return H.s(w)
+y=H.BU(C.xB.yn(x,v+w),16,null)
+return y}catch(u){H.Ru(u)
+return 0}},"call$1","VP",2,0,null,109,[]]}},
+eS:{
+"^":"Tp:107;a",
+call$1:[function(a){return this.a.eC(a)},"call$1",null,2,0,null,191,[],"call"],
+$isEH:true},
+IQ:{
+"^":"Tp:107;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
+$isEH:true},
+TI:{
+"^":"Tp:107;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,378,[],"call"],
+$isEH:true},
+at:{
+"^":"Tp:107;a,b",
+call$1:[function(a){var z,y,x,w,v
+z=R.Jk([])
+y=H.B7([],P.L5(null,null,null,null,null))
+y=R.Jk(y)
+x=H.B7([],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+w=J.U6(a)
+v=new G.kx(C.l8,H.BU(w.t(a,"start"),16,null),H.BU(w.t(a,"end"),16,null),[],[],[],0,0,z,y,x,null,null,null,null)
+v.NV(a)
+N.Jx("").To("Added code with 0x"+J.u1(this.b,16)+" to isolate.")
+x=this.a
+J.bi(x.Z0,v)
+x.tx("Code","code",v)},"call$1",null,2,0,null,149,[],"call"],
+$isEH:true},
+wu:{
+"^":"Tp:107;a,b",
+call$1:[function(a){var z=this.b
+z.qi(J.UQ(a,"source"))
+N.Jx("").To("Grabbed script "+H.d(J.UQ(z.gKC(),"name"))+" source.")
+this.a.tx("Script","script",z)},"call$1",null,2,0,null,379,[],"call"],
+$isEH:true},
+Vc:{
+"^":"Tp:107;c,d",
+call$1:[function(a){var z,y
+z=G.Ak(a)
+N.Jx("").To("Added script "+H.d(J.UQ(z.VG,"name"))+" to isolate.")
+y=this.c
+y.tx("Script","script",z)
+J.kW(y.XR,this.d,z)},"call$1",null,2,0,null,379,[],"call"],
+$isEH:true},
+KQ:{
+"^":"Tp:107;a,b",
+call$1:[function(a){var z,y
+z=this.a
+y=J.U6(a)
+y=new G.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,y.t(a,"id"),y.t(a,"type"),null,null,null,null)
+y.wp(z,a)
+return y},"call$1",null,2,0,null,191,[],"call"],
+$isEH:true},
+dZ:{
+"^":"Pi;ec?,jF,JL,MU,AP,fn",
+guw:function(a){return this.ec},
+gB1:[function(a){return this.jF},null,null,1,0,380,"profile",355,356],
+sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,381,23,[],"profile",355],
+gjW:[function(){return this.JL},null,null,1,0,370,"currentHash",355,356],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,25,23,[],"currentHash",355],
+gXX:[function(){return this.MU},null,null,1,0,382,"currentHashUri",355,356],
+sXX:[function(a){this.MU=F.Wi(this,C.tv,this.MU,a)},null,null,3,0,383,23,[],"currentHashUri",355],
+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],
+vI:[function(){var z,y,x,w,v
+z=$.oy().R4(0,this.JL)
+if(z==null)return
+y=z.QK
+x=y.input
+w=y.index
+v=y.index
+if(0>=y.length)return H.e(y,0)
+y=J.q8(y[0])
+if(typeof y!=="number")return H.s(y)
+return C.xB.Nj(x,w,v+y)},"call$0","gzJ",0,0,null],
+V4:[function(){var z,y,x,w
+z=$.oy().R4(0,this.JL)
+if(z==null)return
+y=z.QK
+x=y.input
+w=y.index
+if(0>=y.length)return H.e(y,0)
+y=J.q8(y[0])
+if(typeof y!=="number")return H.s(y)
+return C.xB.yn(x,w+y)},"call$0","gdQ",0,0,null],
+gwB:[function(){return this.vI()!=null},null,null,1,0,380,"hasCurrentIsolate",356],
+R6:[function(){var z=this.vI()
+if(z==null)return""
+return J.D8(z,2)},"call$0","gKo",0,0,null],
+Pr:[function(){var z=this.R6()
+if(z==="")return
+return this.ec.zf.AQ(z)},"call$0","gjf",0,0,358,"currentIsolate",356],
+S7:[function(){var z=J.Co(C.ol.gmW(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/")
+return!0}return!1},"call$0","goO",0,0,null],
+df:[function(){var z,y,x,w
+z=J.Co(C.ol.gmW(window))
+z=F.Wi(this,C.h1,this.JL,z)
+this.JL=z
+y=J.D8(z,1)
+z=this.ec
+x=this.Pr()
+z.Eb=F.Wi(z,C.Z8,z.Eb,x)
+x=P.r6($.qG().ej(y))
+this.MU=F.Wi(this,C.tv,this.MU,x)
+if(this.ec.Eb==null){N.Jx("").j2("Refreshing isolates.")
+this.ec.zf.r3()
+return}w=this.V4()
+N.Jx("").To("Asking "+H.d(J.F8(this.ec.Eb))+" for "+w)
+this.ec.Eb.ox(w).ml(new G.GH(this))},"call$0","glq",0,0,null],
+static:{"^":"x4,Qq,qY"}},
+Qe:{
+"^":"Tp:107;a",
+call$1:[function(a){var z=this.a
+if(z.S7())return
+F.Wi(z,C.D2,z.vI()==null,z.vI()!=null)
+z.df()},"call$1",null,2,0,null,384,[],"call"],
+$isEH:true},
+GH:{
+"^":"Tp:107;a",
+call$1:[function(a){var z=this.a.ec
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1",null,2,0,null,385,[],"call"],
+$isEH:true},
+Q4:{
+"^":["Pi;Yu<-386,m7<-387,L4<-387,NC,xb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+ga0:[function(){return this.NC},null,null,1,0,371,"ticks",355,356],
+sa0:[function(a){this.NC=F.Wi(this,C.p1,this.NC,a)},null,null,3,0,372,23,[],"ticks",355],
+gGK:[function(){return this.xb},null,null,1,0,388,"percent",355,356],
+sGK:[function(a){this.xb=F.Wi(this,C.tI,this.xb,a)},null,null,3,0,389,23,[],"percent",355],
+oS:[function(){var z=this.xb
+if(z==null||J.Hb(z,0))return""
+return J.Ez(this.xb,2)+"% ("+H.d(this.NC)+")"},"call$0","gu3",0,0,370,"formattedTicks",356],
+xt:[function(){return"0x"+J.u1(this.Yu,16)},"call$0","gDa",0,0,370,"formattedAddress",356]},
+WAE:{
+"^":"a;Zd",
+bu:[function(a){return"CodeKind."+this.Zd},"call$0","gXo",0,0,null],
+static:{"^":"r1,pg,WAg",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
+throw H.b(P.hS())},"call$1","Tx",2,0,null,86,[]]}},
+N8:{
+"^":"a;Yu<,pO,Iw"},
+Vi:{
+"^":"a;tT>,Av<"},
+kx:{
+"^":["Pi;fY>,vg,Mb,a0<,VS<,hw,fF<,Du<,va<-390,tQ,Ge,hI,HJ,AP,fn",null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
+gkx:[function(){return this.tQ},null,null,1,0,354,"functionRef",355,356],
+skx:[function(a){this.tQ=F.Wi(this,C.yg,this.tQ,a)},null,null,3,0,357,23,[],"functionRef",355],
+gZN:[function(){return this.Ge},null,null,1,0,354,"codeRef",355,356],
+sZN:[function(a){this.Ge=F.Wi(this,C.EX,this.Ge,a)},null,null,3,0,357,23,[],"codeRef",355],
+goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
+soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
+giK:[function(){return this.HJ},null,null,1,0,370,"userName",355,356],
+siK:[function(a){this.HJ=F.Wi(this,C.ct,this.HJ,a)},null,null,3,0,25,23,[],"userName",355],
+R3:[function(a,b){var z,y,x,w,v,u,t
+z=J.U6(b)
+this.fF=H.BU(z.t(b,"inclusive_ticks"),null,null)
+this.Du=H.BU(z.t(b,"exclusive_ticks"),null,null)
+y=z.t(b,"ticks")
+if(y!=null&&J.z8(J.q8(y),0)){z=J.U6(y)
+x=this.a0
+w=0
+while(!0){v=z.gB(y)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=H.BU(z.t(y,w),16,null)
+t=H.BU(z.t(y,w+1),null,null)
+x.push(new G.N8(u,H.BU(z.t(y,w+2),null,null),t))
+w+=3}}},"call$1","gOT",2,0,null,149,[]],
+QQ:[function(){return this.uL(this.VS)},"call$0","gyj",0,0,null],
+dJ:[function(a){return this.KU(this.VS,a)},"call$1","gf7",2,0,null,141,[]],
+uL:[function(a){var z,y,x
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]),y=0;z.G();){x=z.lo.gAv()
+if(typeof x!=="number")return H.s(x)
+y+=x}return y},"call$1","grr",2,0,null,391,[]],
+KU:[function(a,b){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(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gKZ",4,0,null,391,[],141,[]],
+xF:[function(a,b){var z=J.U6(a)
+this.lC(this.VS,z.t(a,"callers"),b)
+this.lC(this.hw,z.t(a,"callees"),b)},"call$2","gL0",4,0,null,141,[],392,[]],
+lC:[function(a,b,c){var z,y,x,w,v
+C.Nm.sB(a,0)
+z=J.U6(b)
+y=0
+while(!0){x=z.gB(b)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+w=H.BU(z.t(b,y),null,null)
+v=H.BU(z.t(b,y+1),null,null)
+if(w>>>0!==w||w>=c.length)return H.e(c,w)
+a.push(new G.Vi(c[w],v))
+y+=2}H.ZE(a,0,a.length-1,new G.fx())},"call$3","gPG",6,0,null,391,[],239,[],392,[]],
+FB:[function(){this.fF=0
+this.Du=0
+C.Nm.sB(this.a0,0)
+for(var z=J.GP(this.va);z.G();)z.gl().sa0(0)},"call$0","gNB",0,0,null],
+iv:[function(a){var z,y,x,w,v
+z=this.va
+y=J.w1(z)
+y.V1(z)
+x=J.U6(a)
+w=0
+while(!0){v=x.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+c$0:{if(J.de(x.t(a,w),""))break c$0
+y.h(z,new G.Q4(H.BU(x.t(a,w),null,null),x.t(a,w+1),x.t(a,w+2),0,null,null,null))}w+=3}},"call$1","goU",2,0,null,393,[]],
+tg:[function(a,b){var z=J.Wx(b)
+return z.F(b,this.vg)&&z.C(b,this.Mb)},"call$1","gdj",2,0,null,373,[]],
+NV:function(a){var z,y
+z=J.U6(a)
+y=z.t(a,"function")
+y=R.Jk(y)
+this.tQ=F.Wi(this,C.yg,this.tQ,y)
+y=R.Jk(a)
+this.Ge=F.Wi(this,C.EX,this.Ge,y)
+y=z.t(a,"name")
+this.hI=F.Wi(this,C.YS,this.hI,y)
+y=z.t(a,"user_name")
+this.HJ=F.Wi(this,C.ct,this.HJ,y)
+if(z.t(a,"disassembly")!=null)this.iv(z.t(a,"disassembly"))},
+$iskx:true},
+fx:{
+"^":"Tp:346;",
+call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,128,[],188,[],"call"],
+$isEH:true},
+CM:{
+"^":"a;Aq>,tm,hV<",
+j8:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+z=J.U6(a)
+if(!J.de(z.t(a,"type"),"ProfileCode"))return
+y=this.Aq
+x=y.hv(H.BU(J.UQ(z.t(a,"code"),"start"),16,null))
+if(x==null){w=G.CQ(z.t(a,"kind"))
+v=z.t(a,"code")
+z=J.U6(v)
+u=H.BU(z.t(v,"start"),16,null)
+t=H.BU(z.t(v,"end"),16,null)
+s=z.t(v,"name")
+r=z.t(v,"user_name")
+q=R.Jk([])
+p=H.B7([],P.L5(null,null,null,null,null))
+p=R.Jk(p)
+o=H.B7([],P.L5(null,null,null,null,null))
+o=R.Jk(o)
+x=new G.kx(w,u,t,[],[],[],0,0,q,p,o,s,null,null,null)
+x.Ge=F.Wi(x,C.EX,o,v)
+o=z.t(v,"function")
+q=R.Jk(o)
+x.tQ=F.Wi(x,C.yg,x.tQ,q)
+x.HJ=F.Wi(x,C.ct,x.HJ,r)
+if(z.t(v,"disassembly")!=null){x.iv(z.t(v,"disassembly"))
+z.u(v,"disassembly",null)}J.bi(y.gZ0(),x)}J.JD(x,a)
+this.tm.push(x)},"call$1","gWF",2,0,null,394,[]],
+T0:[function(a){var z,y
+z=this.Aq.gZ0()
+y=J.w1(z)
+y.GT(z,new G.vu())
+if(J.u6(y.gB(z),a)||J.de(a,0))return z
+return y.D6(z,0,a)},"call$1","gmZ",2,0,null,127,[]],
+uH:function(a,b){var z,y,x,w,v
+z=J.U6(b)
+y=z.t(b,"codes")
+this.hV=z.t(b,"samples")
+z=J.U6(y)
+N.Jx("").To("Creating profile from "+H.d(this.hV)+" samples and "+H.d(z.gB(y))+" code objects.")
+this.Aq.R7()
+x=this.tm
+C.Nm.sB(x,0)
+z.aN(y,new G.xn(this))
+w=0
+while(!0){v=z.gB(y)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+if(w>=x.length)return H.e(x,w)
+x[w].xF(z.t(y,w),x);++w}C.Nm.sB(x,0)},
+static:{hh:function(a,b){var z=new G.CM(a,H.VM([],[G.kx]),0)
+z.uH(a,b)
+return z}}},
+xn:{
+"^":"Tp:107;a",
+call$1:[function(a){var z,y,x,w
+try{this.a.j8(a)}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+N.Jx("").wF("Error processing code object. "+H.d(z)+" "+H.d(y),z,y)}},"call$1",null,2,0,null,141,[],"call"],
+$isEH:true},
+vu:{
+"^":"Tp:395;",
+call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,128,[],188,[],"call"],
+$isEH:true},
+c2:{
+"^":["Pi;Rd>-386,ye,i0,AP,fn",function(){return[C.mI]},null,null,null,null],
+gu9:[function(){return this.ye},null,null,1,0,371,"hits",355,356],
+su9:[function(a){this.ye=F.Wi(this,C.K7,this.ye,a)},null,null,3,0,372,23,[],"hits",355],
+ga4:[function(a){return this.i0},null,null,1,0,370,"text",355,356],
+sa4:[function(a,b){this.i0=F.Wi(this,C.MB,this.i0,b)},null,null,3,0,25,23,[],"text",355],
+goG:function(){return J.J5(this.ye,0)},
+gVt:function(){return J.z8(this.ye,0)},
+$isc2:true},
+rj:{
+"^":["Pi;I2,VG,pw,tq,Sw<-396,iA,AP,fn",null,null,null,null,function(){return[C.mI]},null,null,null],
+gfY:[function(a){return this.I2},null,null,1,0,370,"kind",355,356],
+sfY:[function(a,b){this.I2=F.Wi(this,C.fy,this.I2,b)},null,null,3,0,25,23,[],"kind",355],
+gKC:[function(){return this.VG},null,null,1,0,354,"scriptRef",355,356],
+sKC:[function(a){this.VG=F.Wi(this,C.Be,this.VG,a)},null,null,3,0,357,23,[],"scriptRef",355],
+gQT:[function(){return this.pw},null,null,1,0,370,"shortName",355,397],
+sQT:[function(a){this.pw=F.Wi(this,C.Kt,this.pw,a)},null,null,3,0,25,23,[],"shortName",355],
+gBi:[function(){return this.tq},null,null,1,0,354,"libraryRef",355,356],
+sBi:[function(a){this.tq=F.Wi(this,C.cg,this.tq,a)},null,null,3,0,357,23,[],"libraryRef",355],
+giI:function(){return this.iA},
+gHh:[function(){return J.Pr(this.Sw,1)},null,null,1,0,398,"linesForDisplay",356],
+H2:[function(a){var z,y,x,w
+z=this.Sw
+y=J.U6(z)
+x=J.Wx(a)
+if(x.F(a,y.gB(z)))y.sB(z,x.g(a,1))
+w=y.t(z,a)
+if(w==null){w=new G.c2(a,-1,"",null,null)
+y.u(z,a,w)}return w},"call$1","git",2,0,null,399,[]],
+qi:[function(a){var z,y,x,w
+if(a==null)return
+N.Jx("").To("Loading source for "+H.d(J.UQ(this.VG,"name")))
+z=J.uH(a,"\n")
+this.iA=z.length===0
+for(y=0;y<z.length;y=x){x=y+1
+w=this.H2(x)
+if(y>=z.length)return H.e(z,y)
+J.c9(w,z[y])}},"call$1","gUe",2,0,null,27,[]],
+hC:[function(a){var z,y,x
+z=J.U6(a)
+y=0
+while(!0){x=z.gB(a)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+this.H2(z.t(a,y)).su9(z.t(a,y+1))
+y+=2}F.Wi(this,C.C2,"","("+C.CD.yM(this.Nk(),1)+"% covered)")},"call$1","geL",2,0,null,400,[]],
+Nk:[function(){var z,y,x,w
+for(z=J.GP(this.Sw),y=0,x=0;z.G();){w=z.gl()
+if(w==null)continue
+if(!w.goG())continue;++x
+if(!w.gVt())continue;++y}if(x===0)return 0
+return y/x*100},"call$0","gUO",0,0,388,"coveredPercentage",356],
+Jt:[function(){return"("+C.CD.yM(this.Nk(),1)+"% covered)"},"call$0","gic",0,0,370,"coveredPercentageFormatted",356],
+Ea:function(a){var z,y
+z=J.U6(a)
+y=H.B7(["id",z.t(a,"id"),"name",z.t(a,"name"),"user_name",z.t(a,"user_name")],P.L5(null,null,null,null,null))
+y=R.Jk(y)
+this.VG=F.Wi(this,C.Be,this.VG,y)
+y=J.D8(z.t(a,"name"),J.WB(J.eJ(z.t(a,"name"),"/"),1))
+this.pw=F.Wi(this,C.Kt,this.pw,y)
+y=z.t(a,"library")
+y=R.Jk(y)
+this.tq=F.Wi(this,C.cg,this.tq,y)
+y=z.t(a,"kind")
+this.I2=F.Wi(this,C.fy,this.I2,y)
+this.qi(z.t(a,"source"))},
+$isrj:true,
+static:{Ak:function(a){var z,y,x
+z=H.B7([],P.L5(null,null,null,null,null))
+z=R.Jk(z)
+y=H.B7([],P.L5(null,null,null,null,null))
+y=R.Jk(y)
+x=H.VM([],[G.c2])
+x=R.Jk(x)
+x=new G.rj(null,z,null,y,x,!0,null,null)
+x.Ea(a)
+return x}}},
+af:{
+"^":"d3;Aq>",
+gPj:function(a){return H.d(this.Aq.rI)+"/"+H.d(this.rI)},
+gjO:function(a){return this.rI}},
+SI:{
+"^":"af;YY,Aq,rI,we,R9,wv,V2,me",
+zr:[function(a){var z=this.Aq
+z.zf.Sl(H.d(z.rI)+"/"+H.d(this.rI)).ml(this.gE7())
+return P.Ab(this,null)},"call$0","gvC",0,0,null],
+Tn:[function(a){var z=this.YY
+z.V1(0)
+z.FV(0,a)},"call$1","gE7",2,0,401,191,[]],
+FV:[function(a,b){return this.YY.FV(0,b)},"call$1","gDY",2,0,null,104,[]],
+V1:[function(a){return this.YY.V1(0)},"call$0","gyP",0,0,null],
+di:[function(a){return this.YY.Zp.di(a)},"call$1","gmc",2,0,null,277,[]],
+x4:[function(a){return this.YY.Zp.x4(a)},"call$1","gV9",2,0,null,402,[]],
+aN:[function(a,b){return this.YY.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+Rz:[function(a,b){return this.YY.Rz(0,b)},"call$1","gRI",2,0,null,42,[]],
+t:[function(a,b){return this.YY.Zp.t(0,b)},"call$1","gIA",2,0,null,402,[]],
+u:[function(a,b,c){this.YY.u(0,b,c)
+return c},"call$2","gj3",4,0,null,402,[],277,[]],
+gl0:function(a){var z=this.YY.Zp
+return z.gB(z)===0},
+gor:function(a){var z=this.YY.Zp
+return z.gB(z)!==0},
+gvc:function(a){var z=this.YY.Zp
+return z.gvc(z)},
+gUQ:function(a){var z=this.YY.Zp
+return z.gUQ(z)},
+gB:function(a){var z=this.YY.Zp
+return z.gB(z)},
+wp:function(a,b){var z=this.YY
+z.V1(0)
+z.FV(0,b)},
+$isZ0:true,
+$asZ0:function(){return[null,null]}},
+Y2:{
+"^":["Pi;eT>,yt<-386,wd>-403,oH<-404",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
+if(z!==b)if(b)this.C4(0)
+else this.o8()},
+r8:[function(){this.soE(0,!this.z3)
+return this.z3},"call$0","gMk",0,0,null],
+$isY2:true},
+XN:{
+"^":["Pi;rO,WT>-403,AP,fn",null,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,405,[]],
+Mf:[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,406,[]],
+VE:[function(a){var z,y,x,w,v,u,t
+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,363,[]],
+PP:[function(a){var z,y,x,w,v
+z=J.RE(a)
+y=J.q8(z.gwd(a))
+if(J.de(y,0))return
+if(typeof y!=="number")return H.s(y)
+x=0
+for(;x<y;++x)if(J.YV(J.UQ(z.gwd(a),x))===!0)this.PP(J.UQ(z.gwd(a),x))
+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,363,[]]},
+No:{
+"^":["Pi;ec?,i2<-407",null,function(){return[C.mI]}],
+guw:[function(a){return this.ec},null,null,1,0,408,"app",356],
+Sl:[function(a){return this.GS(a).ml(new G.PG()).OA(new G.YW())},"call$1","gdI",2,0,null,265,[]],
+AQ:[function(a){var z,y,x,w,v,u
+z=this.i2
+y=J.U6(z)
+x=y.t(z,a)
+if(x!=null)return x
+w=P.L5(null,null,null,J.O,G.rj)
+w=R.Jk(w)
+v=H.VM([],[G.kx])
+u=P.L5(null,null,null,J.O,J.GW)
+u=R.Jk(u)
+x=new G.bv(this,a,"Isolate",null,w,v,"isolate",null,null,null,u,0,0,null,null,null,null)
+y.u(z,a,x)
+return x},"call$1","grE",2,0,null,110,[]],
+GR:[function(a){var z=[]
+J.kH(this.i2,new G.Yu(a,z))
+H.bQ(z,new G.y2(this))
+J.kH(a,new G.Hq(this))},"call$1","gZM",2,0,null,111,[]],
+r3:[function(){this.Sl("isolates").ml(new G.Pl(this))},"call$0","gNI",0,0,null]},
+PG:{
+"^":"Tp:107;",
+call$1:[function(a){var z,y,x,w,v
+try{z=C.xr.kV(a)
+w=R.Jk(z)
+return w}catch(v){w=H.Ru(v)
+y=w
+x=new H.XO(v,null)
+w=H.B7(["type","Error","errorType","DecodeError","text",H.d(y)+" "+H.d(x)],P.L5(null,null,null,null,null))
+w=R.Jk(w)
+return w}},"call$1",null,2,0,null,379,[],"call"],
+$isEH:true},
+YW:{
+"^":"Tp:107;",
+call$1:[function(a){var z=H.B7(["type","Error","errorType","FetchError","text",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,160,[],"call"],
+$isEH:true},
+BO:{
+"^":"Tp:107;a",
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,409,[],"call"],
+$isEH:true},
+Yu:{
+"^":"Tp:346;a,b",
+call$2:[function(a,b){if(G.js(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,402,[],277,[],"call"],
+$isEH:true},
+y2:{
+"^":"Tp:107;c",
+call$1:[function(a){J.V1(this.c.i2,a)},"call$1",null,2,0,null,110,[],"call"],
+$isEH:true},
+Hq:{
+"^":"Tp:107;d",
+call$1:[function(a){var z,y,x,w,v,u,t,s,r
+z=J.U6(a)
+y=z.t(a,"id")
+x=this.d
+w=x.i2
+v=J.U6(w)
+u=v.t(w,y)
+if(u==null){t=P.L5(null,null,null,J.O,G.rj)
+t=R.Jk(t)
+s=H.VM([],[G.kx])
+r=P.L5(null,null,null,J.O,J.GW)
+r=R.Jk(r)
+u=new G.bv(x,z.t(a,"id"),"Isolate",null,t,s,z.t(a,"name"),null,null,null,r,0,0,null,null,null,null)
+v.u(w,y,u)}J.KM(u)},"call$1",null,2,0,null,149,[],"call"],
+$isEH:true},
+Pl:{
+"^":"Tp:107;a",
+call$1:[function(a){var z,y
+z=this.a
+z.GR(J.UQ(a,"members"))
+z=z.ec
+z.toString
+y=R.Jk(a)
+z.AJ=F.Wi(z,C.mE,z.AJ,y)},"call$1",null,2,0,null,149,[],"call"],
+$isEH:true},
+XK:{
+"^":["No;Yu<,ec,i2-407,AP,fn",null,null,function(){return[C.mI]},null,null],
+GS:[function(a){var z=this.Yu
+N.Jx("").To("Fetching "+H.d(a)+" from "+z)
+return W.It(C.xB.g(z,a),null,null)},"call$1","gFw",2,0,null,265,[]]},
+ho:{
+"^":["No;Ct,pL,ec,i2-407,AP,fn",null,null,null,function(){return[C.mI]},null,null],
+rz:[function(a){var z,y,x,w,v
+z=J.RE(a)
+y=J.UQ(z.gRn(a),"id")
+x=J.UQ(z.gRn(a),"name")
+w=J.UQ(z.gRn(a),"data")
+if(!J.de(x,"observatoryData"))return
+z=this.Ct
+v=z.t(0,y)
+z.Rz(0,y)
+J.Xf(v,w)},"call$1","gcW",2,0,158,19,[]],
+GS:[function(a){var z,y,x
+z=""+this.pL
+y=H.B7([],P.L5(null,null,null,null,null))
+y.u(0,"id",z)
+y.u(0,"method","observatoryQuery")
+y.u(0,"query","/"+H.d(a))
+this.pL=this.pL+1
+x=H.VM(new P.Zf(P.Dt(null)),[null])
+this.Ct.u(0,z,x)
+J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
+return x.MM},"call$1","gFw",2,0,null,265,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+"^":"",
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/isolate_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/disassembly_entry.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.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/vm_element.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/heap_profile.dart","package:observatory/src/elements/isolate_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/message_viewer.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,107]},1],["breakpoint_list_element","package:observatory/src/observatory_elements/breakpoint_list.dart",,B,{
+F.E2()},"call$0","nE",0,0,112]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Vf;BW%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grs:[function(a){return a.BW},null,null,1,0,352,"msg",353,354],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,355,23,[],"msg",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP("breakpoints")
-a.hm.gDF().fB(z).ml(new B.j3(a)).OA(new B.i0()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["Ur;BW%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+grs:[function(a){return a.BW},null,null,1,0,354,"msg",355,397],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,357,23,[],"msg",355],
+RF:[function(a,b){a.pC.oX("breakpoints").ml(new B.j3(a)).OA(new B.i0()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{Dw:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
@@ -10765,27 +11501,27 @@
 a.X0=v
 C.J0.ZL(a)
 C.J0.G6(a)
-return a},null,null,0,0,108,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[357],
-Vf:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[414],
+Ur:{
+"^":"PO+Pi;",
 $isd3:true},
 j3:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sBW(z,y.ct(z,C.UX,y.gBW(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sBW(z,y.ct(z,C.UX,y.gBW(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+BreakpointListElement_refresh_closure":[358],
+"+BreakpointListElement_refresh_closure":[415],
 i0:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing breakpoint-list: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing breakpoint-list: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+BreakpointListElement_refresh_closure":[358]}],["class_ref_element","package:observatory/src/observatory_elements/class_ref.dart",,Q,{
+"+BreakpointListElement_refresh_closure":[415]}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10794,21 +11530,19 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.YZ.ZL(a)
 C.YZ.G6(a)
-return a},null,null,0,0,108,"new ClassRefElement$created"]}},
-"+ClassRefElement":[362]}],["class_view_element","package:observatory/src/observatory_elements/class_view.dart",,Z,{
+return a},null,null,0,0,113,"new ClassRefElement$created"]}},
+"+ClassRefElement":[418]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Ps:{
-"^":["pv;F0%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.F0},null,null,1,0,352,"cls",353,354],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,355,23,[],"cls",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.F0,"id"))
-a.hm.gDF().fB(z).ml(new Z.RI(a)).OA(new Z.Ye()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["KU;F0%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRu:[function(a){return a.F0},null,null,1,0,354,"cls",355,397],
+sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,357,23,[],"cls",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.F0,"id")).ml(new Z.RI(a)).OA(new Z.Ye()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10821,27 +11555,27 @@
 a.X0=w
 C.kk.ZL(a)
 C.kk.G6(a)
-return a},null,null,0,0,108,"new ClassViewElement$created"]}},
-"+ClassViewElement":[363],
-pv:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new ClassViewElement$created"]}},
+"+ClassViewElement":[419],
+KU:{
+"^":"PO+Pi;",
 $isd3:true},
 RI:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sF0(z,y.ct(z,C.XA,y.gF0(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sF0(z,y.ct(z,C.XA,y.gF0(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+ClassViewElement_refresh_closure":[358],
+"+ClassViewElement_refresh_closure":[415],
 Ye:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing class-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing class-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+ClassViewElement_refresh_closure":[358]}],["code_ref_element","package:observatory/src/observatory_elements/code_ref.dart",,O,{
+"+ClassViewElement_refresh_closure":[415]}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10850,20 +11584,19 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.IK.ZL(a)
 C.IK.G6(a)
-return a},null,null,0,0,108,"new CodeRefElement$created"]}},
-"+CodeRefElement":[362]}],["code_view_element","package:observatory/src/observatory_elements/code_view.dart",,F,{
+return a},null,null,0,0,113,"new CodeRefElement$created"]}},
+"+CodeRefElement":[418]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
-vc:{
-"^":["Vfx;eJ%-364,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtT:[function(a){return a.eJ},null,null,1,0,365,"code",353,354],
-stT:[function(a,b){a.eJ=this.ct(a,C.b1,a.eJ,b)},null,null,3,0,366,23,[],"code",353],
-grK:[function(a){return"panel panel-success"},null,null,1,0,367,"cssPanelClass"],
+HT:{
+"^":["qbd;eJ%-420,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtT:[function(a){return a.eJ},null,null,1,0,421,"code",355,397],
+stT:[function(a,b){a.eJ=this.ct(a,C.b1,a.eJ,b)},null,null,3,0,422,23,[],"code",355],
+grK:[function(a){return"panel panel-success"},null,null,1,0,370,"cssPanelClass"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10876,34 +11609,34 @@
 a.X0=w
 C.YD.ZL(a)
 C.YD.G6(a)
-return a},null,null,0,0,108,"new CodeViewElement$created"]}},
-"+CodeViewElement":[368],
-Vfx:{
-"^":"uL+Pi;",
-$isd3:true}}],["collapsible_content_element","package:observatory/src/observatory_elements/collapsible_content.dart",,R,{
+return a},null,null,0,0,113,"new CodeViewElement$created"]}},
+"+CodeViewElement":[423],
+qbd:{
+"^":"PO+Pi;",
+$isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Dsd;zh%-369,HX%-369,Uy%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gl7:[function(a){return a.zh},null,null,1,0,367,"iconClass",353,370],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,25,23,[],"iconClass",353],
-gai:[function(a){return a.HX},null,null,1,0,367,"displayValue",353,370],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,25,23,[],"displayValue",353],
-gxj:[function(a){return a.Uy},null,null,1,0,371,"collapsed"],
+"^":["Ds;zh%-387,HX%-387,Uy%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gl7:[function(a){return a.zh},null,null,1,0,370,"iconClass",355,356],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,25,23,[],"iconClass",355],
+gai:[function(a){return a.HX},null,null,1,0,370,"displayValue",355,356],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,25,23,[],"displayValue",355],
+gxj:[function(a){return a.Uy},null,null,1,0,380,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,372,373,[],"collapsed"],
+this.np(a)},null,null,3,0,381,424,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"call$0","gQd",0,0,107,"enteredView"],
+this.np(a)},"call$0","gQd",0,0,112,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
-this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,374,18,[],303,[],74,[],"toggleDisplay"],
-SS:[function(a){var z,y
+this.np(a)
+this.np(a)},"call$3","gl8",6,0,425,18,[],306,[],74,[],"toggleDisplay"],
+np:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 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,107,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,112,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-369,DI<-369",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-387,DI<-387",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10917,32 +11650,32 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.G6(a)
-return a},null,null,0,0,108,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[375],
-Dsd:{
+return a},null,null,0,0,113,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[426],
+Ds:{
 "^":"uL+Pi;",
-$isd3:true}}],["curly_block_element","package:observatory/src/observatory_elements/curly_block.dart",,R,{
+$isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["Nr;GV%-360,Hu%-360,nx%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-goE:[function(a){return a.GV},null,null,1,0,371,"expanded",353,370],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,372,23,[],"expanded",353],
-gO9:[function(a){return a.Hu},null,null,1,0,371,"busy",353,370],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,372,23,[],"busy",353],
-gFR:[function(a){return a.nx},null,null,1,0,108,"callback",353,354],
+"^":["LP;GV%-417,Hu%-417,nx%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+goE:[function(a){return a.GV},null,null,1,0,380,"expanded",355,356],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,381,23,[],"expanded",355],
+gO9:[function(a){return a.Hu},null,null,1,0,380,"busy",355,356],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,381,23,[],"busy",355],
+gFR:[function(a){return a.nx},null,null,1,0,113,"callback",355,397],
 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,225,23,[],"callback",353],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,107,23,[],"callback",355],
 PA:[function(a){var z
 P.JS("done callback")
 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,107,"doneCallback"],
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,112,"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","ghM",6,0,376,123,[],183,[],280,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,427,128,[],188,[],283,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10958,9 +11691,9 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.G6(a)
-return a},null,null,0,0,108,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[377],
-Nr:{
+return a},null,null,0,0,113,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[428],
+LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
 "^":"",
@@ -10971,20 +11704,20 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
 return z.gtH(z)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,109,[],110,[]],
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,114,[],115,[]],
 Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.call$1(z.lo)===!0)return!0
-return!1},"call$2","cs",4,0,null,109,[],110,[]],
+return!1},"call$2","cs",4,0,null,114,[],115,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.call$2(b,z.lo)
-return b},"call$3","hp",6,0,null,109,[],111,[],112,[]],
+return b},"call$3","hp",6,0,null,114,[],116,[],117,[]],
 mx:[function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
@@ -10993,11 +11726,11 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"call$3","FQ",6,0,null,109,[],113,[],114,[]],
+x.pop()}return z.gvM()},"call$3","FQ",6,0,null,114,[],118,[],119,[]],
 K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-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,68,[],115,[],116,[]],
+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,68,[],120,[],121,[]],
 Og:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
 z=J.xH(c,b)
@@ -11005,7 +11738,7 @@
 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"))
-H.tb(d,e,a,b,z)},"call$5","rK",10,0,null,68,[],115,[],116,[],105,[],117,[]],
+H.tb(d,e,a,b,z)},"call$5","rK",10,0,null,68,[],120,[],121,[],105,[],122,[]],
 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))
@@ -11020,31 +11753,31 @@
 H.Og(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.lo
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","f3",6,0,null,68,[],47,[],109,[]],
+C.Nm.u(a,b,v)}},"call$3","f3",6,0,null,68,[],47,[],114,[]],
 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))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,118,[],119,[],120,[],121,[],122,[]],
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,123,[],124,[],125,[],126,[],127,[]],
 TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"call$4","Yh",8,0,null,123,[],124,[],80,[],125,[]],
+if(J.de(a[z],b))return z}return-1},"call$4","Yh",8,0,null,128,[],129,[],80,[],130,[]],
 eX:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"call$3","Gf",6,0,null,123,[],124,[],80,[]],
+if(J.de(a[y],b))return y}return-1},"call$3","Gf",6,0,null,128,[],129,[],80,[]],
 ZE:[function(a,b,c,d){if(J.Hb(J.xH(c,b),32))H.d1(a,b,c,d)
-else H.d4(a,b,c,d)},"call$4","UR",8,0,null,123,[],126,[],127,[],128,[]],
+else H.d4(a,b,c,d)},"call$4","UR",8,0,null,128,[],131,[],132,[],133,[]],
 d1:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 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","aH",8,0,null,123,[],126,[],127,[],128,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","aH",8,0,null,128,[],131,[],132,[],133,[]],
 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.IJ(J.WB(z.W(a0,b),1),6)
@@ -11145,7 +11878,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,123,[],126,[],127,[],128,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,128,[],131,[],132,[],133,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -11154,7 +11887,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,378,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
 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))},
@@ -11163,13 +11896,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,124,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,129,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(this)
 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,379,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,430,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11189,17 +11922,17 @@
 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","gnr",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,379,[]],
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,110,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gnr",0,2,null,333,334,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,430,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=b
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,111,[],112,[]],
-eR:[function(a,b){return H.j5(this,b,null,null)},"call$1","gZo",2,0,null,122,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,116,[],117,[]],
+eR:[function(a,b){return H.j5(this,b,null,null)},"call$1","gZo",2,0,null,127,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -11212,7 +11945,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,"gRV",0,3,null,336,337,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11236,7 +11969,7 @@
 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,47,[]],
-eR:[function(a,b){return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,122,[]],
+eR:[function(a,b){return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,127,[]],
 qZ:[function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(P.N(b))
 z=this.AN
@@ -11244,7 +11977,7 @@
 if(z==null)return H.j5(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.j5(this.l6,y,x,null)}},"call$1","gVw",2,0,null,122,[]],
+return H.j5(this.l6,y,x,null)}},"call$1","grK4",2,0,null,127,[]],
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
@@ -11288,14 +12021,14 @@
 "^":"i1;l6,T6",
 $isyN:true},
 MH:{
-"^":"Yl;lo,OI,T6",
+"^":"AC;lo,OI,T6",
 mb:function(a){return this.T6.call$1(a)},
 G:[function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
 return!1},"call$0","gqy",0,0,null],
 gl:function(){return this.lo},
-$asYl:function(a,b){return[b]}},
+$asAC:function(a,b){return[b]}},
 A8:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
@@ -11311,7 +12044,7 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 SO:{
-"^":"Yl;OI,T6",
+"^":"AC;OI,T6",
 mb:function(a){return this.T6.call$1(a)},
 G:[function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},"call$0","gqy",0,0,null],
@@ -11337,7 +12070,7 @@
 return!0},"call$0","gqy",0,0,null]},
 H6:{
 "^":"mW;l6,FT",
-eR:[function(a,b){return H.ke(this.l6,this.FT+b,H.Kp(this,0))},"call$1","gZo",2,0,null,289,[]],
+eR:[function(a,b){return H.ke(this.l6,this.FT+b,H.Kp(this,0))},"call$1","gZo",2,0,null,292,[]],
 gA:function(a){var z=this.l6
 z=new H.U1(z.gA(z),this.FT)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -11358,7 +12091,7 @@
 return 0},
 $isyN:true},
 U1:{
-"^":"Yl;OI,FT",
+"^":"AC;OI,FT",
 G:[function(){var z,y
 for(z=this.OI,y=0;y<this.FT;++y)z.G()
 this.FT=0
@@ -11373,8 +12106,8 @@
 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,23,[]],
 xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gRI",2,0,null,124,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,114,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gRI",2,0,null,129,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gyP",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,47,[]]},
 Qr:{
@@ -11383,12 +12116,12 @@
 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,23,[]],
 xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gRI",2,0,null,124,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,77,128,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,114,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gRI",2,0,null,129,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,77,133,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gyP",0,0,null],
 KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isList:true,
 $asWO:null,
 $isyN:true,
@@ -11430,16 +12163,16 @@
 "^":"",
 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,129,[]],
+X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,134,[]],
 vn:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"call$1","Yf",2,0,130,131,[]],
+else return new H.iu(a,4)},"call$1","Yf",2,0,135,136,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,132,[]],
+return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,137,[]],
 tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.U6(b)
 y=z.u8(b,"/")
@@ -11475,15 +12208,15 @@
 if(m==null||m.length===0)x=n
 else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
 x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"call$2","ER",4,0,null,129,[],132,[]],
+return x},"call$2","ER",4,0,null,134,[],137,[]],
 Vv:[function(a){var z,y,x
 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()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,133,[]],
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,138,[]],
 Fk:[function(a){var z,y,x
 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,133,[]],
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,138,[]],
 vE:[function(a,b){var z,y,x,w,v,u
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
@@ -11493,7 +12226,7 @@
 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
-z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,133,[],134,[]],
+z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,138,[],139,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
@@ -11501,14 +12234,14 @@
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"call$2","V8",4,0,null,135,[],132,[]],
+return w},"call$2","V8",4,0,null,140,[],137,[]],
 w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","QB",4,0,null,137,[],12,[]],
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","QB",4,0,null,142,[],12,[]],
 Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -11525,9 +12258,9 @@
 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)
-return P.re(C.yQ)},"call$2","xN",4,0,null,138,[],11,[]],
+return P.re(C.yQ)},"call$2","xN",4,0,null,143,[],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,138,[],139,[]],
+return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,143,[],144,[]],
 pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
@@ -11537,7 +12270,7 @@
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
 w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 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,140,[]],
+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,145,[]],
 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),",")
@@ -11548,7 +12281,7 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,138,[],141,[],61,[],51,[]],
+if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,143,[],146,[],61,[],51,[]],
 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,26,[],98,[]],
@@ -11588,14 +12321,14 @@
 l=p==null?C.xD:p()
 J.bi(z.to(u,new H.nI()),new H.Uz(s,r,q,l,o,n,m,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){return H.VM([],[P.D4])},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TY:{
 "^":"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,41,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,41,[],168,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gfH",4,0,null,41,[],173,[]],
 $isej:true},
 Lj:{
 "^":"TY;MA",
@@ -11604,15 +12337,15 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:381;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,380,[],"call"],
+"^":"Tp:432;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,431,[],"call"],
 $isEH:true},
 am:{
 "^":"TY;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","gqi",4,0,null,43,[],44,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,43,[],44,[]],
 $isNL:true,
 $isej:true},
 cw:{
@@ -11670,7 +12403,7 @@
 if(w==null)w=this.gcc().nb.t(0,a)
 if(w==null)throw H.b(P.lr(this,H.X7(a),[b],null,null))
 w.Hy(this,b)
-return H.vn(b)},"call$2","gtd",4,0,null,65,[],168,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
 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,65,[]],
@@ -11770,19 +12503,19 @@
 "^":"am+M2;",
 $isej:true},
 IB:{
-"^":"Tp:382;a",
+"^":"Tp:433;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:382;a",
+"^":"Tp:433;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return this.a},"call$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
-"^":"Un;AY<,XW,BB,eL,If",
+"^":"Un;AY<,XW,BB,Ra,If",
 gOO:function(){return"ClassMirror"},
 gIf:function(){var z,y
 z=this.BB
@@ -11796,7 +12529,7 @@
 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,77,24,[],43,[],44,[]],
 rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,65,[]],
-PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],168,[]],
+PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
 gkZ:function(){return[this.XW]},
 gHA:function(){return!0},
 gJi:function(){return this},
@@ -11834,10 +12567,10 @@
 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","gqi",8,0,null,12,[],11,[],383,[],82,[]],
+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,[],434,[],82,[]],
 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,65,[],168,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
 rN:[function(a){var z,y,x,w
 $loop$0:{z=this.xq
 if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
@@ -11867,12 +12600,12 @@
 t.v=t.m=w
 return y},"call$1","gFf",2,0,null,65,[]],
 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,238,[],384,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,110,[],435,[]],
 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","gER",4,0,null,12,[],384,[]],
+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,[],435,[]],
 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","gpa",4,0,null,12,[],384,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gpa",4,0,null,12,[],435,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -11888,15 +12621,15 @@
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:385;a",
+"^":"Tp:436;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,129,[],23,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,134,[],23,[],"call"],
 $isEH:true},
 bl:{
-"^":"am;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,eL,RH,If",
+"^":"am;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If",
 gOO:function(){return"ClassMirror"},
 gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
 return this.NK.gCr()},
@@ -11948,7 +12681,7 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,65,[],168,[]],
+PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,65,[],173,[]],
 rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,65,[]],
 gXP:function(){return this.NK.gXP()},
 gc9:function(){return this.NK.gc9()},
@@ -11982,23 +12715,23 @@
 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,386,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:225;",
-call$1:[function(a){return-1},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return-1},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,87,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,387,[],"call"],
+return a},"call$1",null,2,0,null,438,[],"call"],
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,eL,RH,nz,If",
+"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If",
 gOO:function(){return"ClassMirror"},
 gaB:function(){var z,y
 z=this.Tx
@@ -12033,7 +12766,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.nz=a}return x},"call$1","gN4",2,0,null,388,[]],
+s.nz=a}return x},"call$1","gN4",2,0,null,439,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12049,7 +12782,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","gkW",2,0,null,389,[]],
+return z},"call$1","gMp",2,0,null,440,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12089,7 +12822,7 @@
 if(z!=null&&z.gFo()&&!z.gV5()){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
-return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],168,[]],
+return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
 rN:[function(a){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gao()
@@ -12138,7 +12871,7 @@
 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
-return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,138,[]],
+return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,143,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
 z=this.MR(this)
@@ -12168,17 +12901,17 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:382;a",
+"^":"Tp:433;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,387,[],"call"],
+return a},"call$1",null,2,0,null,438,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:391;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:442;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 Ld:{
 "^":"am;ao<,V5<,Fo<,n6,nz,Ay>,le,If",
@@ -12191,7 +12924,7 @@
 this.le=z}return J.C0(z,H.Yf()).br(0)},
 IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,41,[]],
 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,41,[],168,[]],
+$[this.ao]=b},"call$2","gfH",4,0,null,41,[],173,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12222,7 +12955,7 @@
 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
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"call$1","fS",2,0,null,136,[]]}},
+return 0},"call$1","fS",2,0,null,141,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -12292,11 +13025,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","gqi",4,0,null,43,[],44,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,43,[],44,[]],
 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,41,[]],
 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,41,[],168,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gfH",4,0,null,41,[],173,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -12329,8 +13062,8 @@
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:392;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:372;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 ng:{
 "^":"am;Cr<,CM,If",
@@ -12402,15 +13135,15 @@
 z=x+"'"
 this.o3=z
 return z},"call$0","gXo",0,0,null],
-gah:function(){return H.vh(P.SY(null))},
-V7:function(a,b){return this.gah().call$2(a,b)},
-nQ:function(a){return this.gah().call$1(a)},
+gwK:function(){return H.vh(P.SY(null))},
+V7:function(a,b){return this.gwK().call$2(a,b)},
+nQ:function(a){return this.gwK().call$1(a)},
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:393;a",
+"^":"Tp:443;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
@@ -12418,7 +13151,7 @@
 return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:394;b",
+"^":"Tp:444;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
@@ -12429,12 +13162,12 @@
 return z.gCr()},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:392;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:372;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:392;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,390,[],"call"],
+"^":"Tp:372;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
@@ -12444,7 +13177,7 @@
 t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,42,[]],
 x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,42,[]],
 di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
 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
@@ -12464,10 +13197,10 @@
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,142,[],143,[]],
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,147,[],148,[]],
 YK:[function(a){var z=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.O])
 a.aN(0,new H.Xh(z))
-return z},"call$1","OX",2,0,null,144,[]],
+return z},"call$1","OX",2,0,null,149,[]],
 kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -12476,16 +13209,16 @@
   return result;
 })(a, Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"call$1","wp",2,0,null,140,[]],
+return z},"call$1","wp",2,0,null,145,[]],
 Xh:{
-"^":"Tp:395;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,132,[],383,[],"call"],
+"^":"Tp:445;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,137,[],434,[],"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,145,[],146,[]],
+else return b.cR(a)},"call$2","p3",4,0,null,150,[],151,[]],
 pH:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -12505,7 +13238,7 @@
 y=J.Q
 t=H.VM(new P.Zf(P.Dt(y)),[y])
 z.a=t
-return t.MM},"call$2$eagerError","pk",2,3,null,147,148,[],149,[]],
+return t.MM},"call$2$eagerError","pk",2,3,null,152,153,[],154,[]],
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
@@ -12514,7 +13247,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"call$0","qZ",0,0,107],
+throw z}},"call$0","qZ",0,0,112],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -12522,11 +13255,11 @@
 $.S6=z
 P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"call$1","xc",2,0,null,151,[]],
+$.k8=y}},"call$1","xc",2,0,null,156,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,151,[]],
+z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,156,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -12542,70 +13275,70 @@
 return}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-$.X3.hk(y,x)}},"call$1","DC",2,0,null,152,[]],
-YE:[function(a){},"call$1","bZ",2,0,153,23,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,154,77,155,[],156,[]],
-dL:[function(){return},"call$0","v3",0,0,107],
+$.X3.hk(y,x)}},"call$1","DC",2,0,null,157,[]],
+YE:[function(a){},"call$1","bZ",2,0,158,23,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,159,77,160,[],161,[]],
+dL:[function(){return},"call$0","v3",0,0,112],
 FE:[function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(z,y)}},"call$3","CV",6,0,null,157,[],158,[],159,[]],
+c.call$2(z,y)}},"call$3","CV",6,0,null,162,[],163,[],164,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"call$4","QD",8,0,null,160,[],161,[],155,[],156,[]],
-TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,160,[],161,[]],
+b.K5(c,d)},"call$4","QD",8,0,null,165,[],166,[],160,[],161,[]],
+TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,165,[],166,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,160,[],161,[],23,[]],
+b.rX(c)},"call$3","iB",6,0,null,165,[],166,[],23,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=C.jn.cU(a.Fq,1000)
-return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,162,[],151,[]],
+return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,167,[],156,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"call$1","kb",2,0,null,146,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,163,164,[],165,[],146,[],155,[],156,[]],
+return z},"call$1","kb",2,0,null,151,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,168,169,[],170,[],151,[],160,[],161,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.call$0()
 z=P.PJ(c)
 try{y=d.call$0()
-return y}finally{$.X3=z}},"call$4","AI",8,0,166,164,[],165,[],146,[],110,[]],
+return y}finally{$.X3=z}},"call$4","AI",8,0,171,169,[],170,[],151,[],115,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.call$1(e)
 z=P.PJ(c)
 try{y=d.call$1(e)
-return y}finally{$.X3=z}},"call$5","MM",10,0,167,164,[],165,[],146,[],110,[],168,[]],
+return y}finally{$.X3=z}},"call$5","MM",10,0,172,169,[],170,[],151,[],115,[],173,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.call$2(e,f)
 z=P.PJ(c)
 try{y=d.call$2(e,f)
-return y}finally{$.X3=z}},"call$6","l4",12,0,169,164,[],165,[],146,[],110,[],54,[],55,[]],
-Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,170,164,[],165,[],146,[],110,[]],
-cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,171,164,[],165,[],146,[],110,[]],
-VI:[function(a,b,c,d){return d},"call$4","uu",8,0,172,164,[],165,[],146,[],110,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,173,164,[],165,[],146,[],110,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,174,164,[],165,[],146,[],162,[],151,[]],
-XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,175,164,[],165,[],146,[],176,[]],
-CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,177,176,[]],
+return y}finally{$.X3=z}},"call$6","l4",12,0,174,169,[],170,[],151,[],115,[],54,[],55,[]],
+Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,175,169,[],170,[],151,[],115,[]],
+cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,176,169,[],170,[],151,[],115,[]],
+VI:[function(a,b,c,d){return d},"call$4","uu",8,0,177,169,[],170,[],151,[],115,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,178,169,[],170,[],151,[],115,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,179,169,[],170,[],151,[],167,[],156,[]],
+XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,180,169,[],170,[],151,[],181,[]],
+CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,182,181,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Fl()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"call$5","hn",10,0,178,164,[],165,[],146,[],179,[],180,[]],
+return new P.uo(c,d,z)},"call$5","hn",10,0,183,169,[],170,[],151,[],184,[],185,[]],
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
 Ik:{
 "^":"O9;Y8"},
 JI:{
-"^":"oh;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
+"^":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
 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,396,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,446,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},"call$0","gUe",0,0,null],
+this.Ae=z^1},"call$0","gXI1",0,0,null],
 gP4:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
@@ -12615,10 +13348,10 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){return},"call$0","gp4",0,0,107],
-LP:[function(){return},"call$0","gZ9",0,0,107],
+uO:[function(){return},"call$0","gp4",0,0,112],
+LP:[function(){return},"call$0","gZ9",0,0,112],
 static:{"^":"FJ,RG,cP"}},
-Ks:{
+LO:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
 gP4:function(){return(this.Gv&2)!==0},
@@ -12633,17 +13366,17 @@
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
-a.siE(a)},"call$1","gOo",2,0,null,160,[]],
+a.siE(a)},"call$1","gOo",2,0,null,165,[]],
 j0:[function(a){if(a.giE()===a)return
 if(a.gP4())a.dK()
 else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,160,[]],
+if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,165,[]],
 q7:[function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},"call$0","gVo",0,0,null],
 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,"Ks")},233,[]],
+this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"LO")},239,[]],
 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","gXB",2,2,397,77,155,[],156,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gXB",2,2,447,77,160,[],161,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -12652,8 +13385,8 @@
 y=this.SL()
 this.SY()
 return y},"call$0","gJK",0,0,null],
-Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,233,[]],
-V8:[function(a,b){this.pb(a,b)},"call$2","grd",4,0,null,155,[],156,[]],
+Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,239,[]],
+V8:[function(a,b){this.pb(a,b)},"call$2","grd",4,0,null,160,[],161,[]],
 Qj:[function(){var z=this.WX
 this.WX=null
 this.Gv=this.Gv&4294967287
@@ -12677,45 +13410,45 @@
 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,378,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,429,[]],
 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:{
-"^":"Ks;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv=this.Gv|2
 this.iE.Rg(0,a)
 this.Gv=this.Gv&4294967293
 if(this.iE===this)this.Of()
-return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,233,[]],
+return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,239,[]],
 pb:[function(a,b){if(this.iE===this)return
-this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,155,[],156,[]],
+this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,160,[],161,[]],
 SY:[function(){if(this.iE!==this)this.nE(new P.Bg(this))
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
 tK:{
 "^":"Tp;a,b",
-call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,160,[],"call"],
+call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,165,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,160,[],"call"],
+call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,165,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-call$1:[function(a){a.Qj()},"call$1",null,2,0,null,160,[],"call"],
+call$1:[function(a){a.Qj()},"call$1",null,2,0,null,165,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Zj",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
-"^":"Ks;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},"call$1","gm9",2,0,null,233,[]],
+z.w6(y)}},"call$1","gm9",2,0,null,239,[]],
 pb:[function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,155,[],156,[]],
+for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,160,[],161,[]],
 SY:[function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
@@ -12723,7 +13456,7 @@
 "^":"a;",
 $isb8:true},
 j7:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -12732,10 +13465,10 @@
 z.c=x
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"call$2",null,4,0,null,398,[],399,[],"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"call$2",null,4,0,null,448,[],449,[],"call"],
 $isEH:true},
 ff:{
-"^":"Tp:400;a,c,d",
+"^":"Tp:450;a,c,d",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.c-1
@@ -12754,12 +13487,12 @@
 "^":"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,401,77,23,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,451,77,23,[]],
 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,397,77,155,[],156,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,447,77,160,[],161,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -12774,28 +13507,28 @@
 z=$.X3
 y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
-return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"gxY",2,3,null,77,110,[],159,[]],
+return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"gVy",2,3,null,77,115,[],164,[]],
 yd:[function(a,b){var z,y,x
 z=$.X3
 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,77,159,[],379,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,77,164,[],430,[]],
 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","gE1",2,0,null,378,[]],
+return y},"call$1","gE1",2,0,null,429,[]],
 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,23,[]],
+this.jk=a},"call$1","gHa",2,0,null,23,[]],
 E6:[function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,155,[],156,[]],
+this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,160,[],161,[]],
 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,294,[]],
+this.jk=a}},"call$1","gXA",2,0,null,297,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
@@ -12809,7 +13542,7 @@
 P.HZ(this,y)},"call$1","gJJ",2,0,null,23,[]],
 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,154,77,155,[],156,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,159,77,160,[],161,[]],
 OH:[function(a){var z,y
 z=J.x(a)
 y=typeof a==="object"&&a!==null&&!!z.$isb8
@@ -12821,7 +13554,7 @@
 this.Lj.wr(new P.rH(this,a))},"call$1","gZV",2,0,null,23,[]],
 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,155,[],156,[]],
+this.Lj.wr(new P.ZL(this,a,b))},"call$2","gFE",4,0,null,160,[],161,[]],
 L7:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
@@ -12837,7 +13570,7 @@
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,27,[],150,[]],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,27,[],155,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -12878,29 +13611,29 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","WY",4,0,null,27,[],150,[]]}},
+b=p}},"call$2","DU",4,0,null,27,[],155,[]]}},
 da:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 xw:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){this.a.rX(a)},"call$1",null,2,0,null,23,[],"call"],
 $isEH:true},
 dm:{
-"^":"Tp:402;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,77,155,[],156,[],"call"],
+"^":"Tp:452;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,77,160,[],161,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:108;a,b,c",
+"^":"Tp:113;a,b,c",
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:371;b,c,d,e",
+"^":"Tp:380;b,c,d,e",
 call$0:[function(){var z,y,x,w
 try{this.b.c=this.e.FI(this.d.gO1(),this.c.e.gDL())
 return!0}catch(x){w=H.Ru(x)
@@ -12910,7 +13643,7 @@
 return!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:107;c,b,f,UI",
+"^":"Tp:112;c,b,f,UI",
 call$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.f
@@ -12946,7 +13679,7 @@
 r.b=!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:107;c,b,bK,Gq,Rm",
+"^":"Tp:112;c,b,bK,Gq,Rm",
 call$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -12968,25 +13701,25 @@
 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:225;c,w3",
-call$1:[function(a){P.HZ(this.c.e,this.w3)},"call$1",null,2,0,null,403,[],"call"],
+"^":"Tp:107;c,w3",
+call$1:[function(a){P.HZ(this.c.e,this.w3)},"call$1",null,2,0,null,453,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:402;a,HZ",
+"^":"Tp:452;a,HZ",
 call$2:[function(a,b){var z,y,x,w
 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.HZ)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,155,[],156,[],"call"],
+w.E6(a,b)}P.HZ(z.a,this.HZ)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,160,[],161,[],"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,404,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,454,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -12998,13 +13731,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,378,[]],
+return y},"call$1","gjw",2,0,null,429,[]],
 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,379,[]],
+return y},"call$1","gG2",2,0,null,430,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
@@ -13024,7 +13757,7 @@
 return y},"call$0","gRV",0,0,null],
 eR:[function(a,b){var z=H.VM(new P.dq(b,this),[null])
 z.U6(this,b,null)
-return z},"call$1","gZo",2,0,null,122,[]],
+return z},"call$1","gZo",2,0,null,127,[]],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13052,36 +13785,36 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,124,[],"call"],
+P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:108;e,f",
+"^":"Tp:113;e,f",
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:372;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,405,[],"call"],
+"^":"Tp:381;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
 $isEH:true},
 zn:{
-"^":"Tp:108;bK",
+"^":"Tp:113;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,124,[],"call"],
+call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,129,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:108;e,f",
+"^":"Tp:113;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:225;",
-call$1:[function(a){},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:108;UI",
+"^":"Tp:113;UI",
 call$0:[function(){this.UI.rX(null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -13089,45 +13822,45 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,124,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:108;e,f",
+"^":"Tp:113;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:372;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,405,[],"call"],
+"^":"Tp:381;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:108;bK",
+"^":"Tp:113;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
-z.a=z.a+1},"call$1",null,2,0,null,237,[],"call"],
+z.a=z.a+1},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 uO:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){this.b.rX(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:225;a,b",
-call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:108;c",
+"^":"Tp:113;c",
 call$0:[function(){this.c.rX(!0)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,233,[],"call"],
+call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,239,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:108;c,d",
+"^":"Tp:113;c,d",
 call$0:[function(){this.d.rX(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
@@ -13136,7 +13869,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:108;d",
+"^":"Tp:113;d",
 call$0:[function(){this.d.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
@@ -13147,7 +13880,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:108;a,c",
+"^":"Tp:113;a,c",
 call$0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
@@ -13160,7 +13893,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ib:{
-"^":"Tp:108;a,d",
+"^":"Tp:113;a,d",
 call$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -13183,7 +13916,7 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gGE",2,0,null,406,[]],
+return w},"call$1","gGE",2,0,null,456,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
 n:[function(a,b){var z
 if(b==null)return!1
@@ -13192,27 +13925,27 @@
 if(typeof b!=="object"||b===null||!z.$isO9)return!1
 return b.Y8===this.Y8},"call$1","gUJ",2,0,null,104,[]],
 $isO9:true},
-oh:{
+yU:{
 "^":"KA;Y8<",
 tA:[function(){return this.gY8().j0(this)},"call$0","gQC",0,0,null],
-uO:[function(){this.gY8()},"call$0","gp4",0,0,107],
-LP:[function(){this.gY8()},"call$0","gZ9",0,0,107]},
+uO:[function(){this.gY8()},"call$0","gp4",0,0,112],
+LP:[function(){this.gY8()},"call$0","gZ9",0,0,112]},
 nP:{
 "^":"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,407,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,457,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
 this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,29,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,408,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,458,[]],
 nB:[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.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,409,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13236,19 +13969,19 @@
 Rg:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,233,[]],
+else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,239,[]],
 V8:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},"call$2","grd",4,0,null,155,[],156,[]],
+else this.w6(new P.DS(a,b,null))},"call$2","grd",4,0,null,160,[],161,[]],
 Qj:[function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},"call$0","gS2",0,0,null],
-uO:[function(){},"call$0","gp4",0,0,107],
-LP:[function(){},"call$0","gZ9",0,0,107],
+uO:[function(){},"call$0","gp4",0,0,112],
+LP:[function(){},"call$0","gZ9",0,0,112],
 tA:[function(){},"call$0","gQC",0,0,null],
 w6:[function(a){var z,y
 z=this.Ri
@@ -13257,19 +13990,19 @@
 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,410,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,384,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,233,[]],
+this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,239,[]],
 pb:[function(a,b){var z,y
 z=this.Gv
 y=new P.Vo(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
 this.Ek()
 y.call$0()}else{y.call$0()
-this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,155,[],156,[]],
+this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,160,[],161,[]],
 SY:[function(){this.Ek()
 this.Gv=(this.Gv|16)>>>0
 new P.qB(this).call$0()},"call$0","gXm",0,0,null],
@@ -13277,7 +14010,7 @@
 this.Gv=(z|32)>>>0
 a.call$0()
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gc2",2,0,null,151,[]],
+this.Kl((z&4)!==0)},"call$1","gc2",2,0,null,156,[]],
 Kl:[function(a){var z,y,x
 z=this.Gv
 if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
@@ -13293,11 +14026,11 @@
 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,411,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,460,[]],
 $isMO:true,
 static:{"^":"ry,bG,Q9,Ir,Il,X8,HX,GC,f9"}},
 Vo:{
-"^":"Tp:107;a,b,c",
+"^":"Tp:112;a,b,c",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -13313,7 +14046,7 @@
 else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"call$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -13328,25 +14061,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,77,77,77,412,[],406,[],413,[],159,[]],
+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,77,77,77,461,[],456,[],462,[],164,[]],
 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","gGE",2,0,null,406,[]]},
+return y},"call$1","gGE",2,0,null,456,[]]},
 ti:{
 "^":"a;aw@"},
 LV:{
 "^":"ti;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,414,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,463,[]]},
 DS:{
 "^":"ti;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,414,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,463,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,414,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,463,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -13355,9 +14088,9 @@
 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,414,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,463,[]]},
 CR:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -13371,26 +14104,26 @@
 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,410,[]],
+this.N6=b}},"call$1","ght",2,0,null,384,[]],
 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,414,[]],
+z.dP(a)},"call$1","gKt",2,0,null,463,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null},"call$0","gyP",0,0,null]},
 v1y:{
-"^":"Tp:108;a,b,c",
+"^":"Tp:113;a,b,c",
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:415;a,b",
-call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,155,[],156,[],"call"],
+"^":"Tp:464;a,b",
+call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,160,[],161,[],"call"],
 $isEH:true},
 Q0:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){return this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
@@ -13406,27 +14139,27 @@
 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,77,77,77,412,[],406,[],413,[],159,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,233,[],416,[]],
+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,77,77,77,461,[],456,[],462,[],164,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,239,[],465,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,233,[]],
+P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,239,[]],
 V8:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},"call$2","grd",4,0,null,155,[],156,[]],
+P.KA.prototype.V8.call(this,a,b)},"call$2","grd",4,0,null,160,[],161,[]],
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"call$0","gp4",0,0,107],
+z.yy(0)},"call$0","gp4",0,0,112],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE()},"call$0","gZ9",0,0,107],
+z.QE()},"call$0","gZ9",0,0,112],
 tA:[function(){var z=this.Ee
 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")},233,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,417,155,[],156,[]],
-nn:[function(){this.Qj()},"call$0","gH1",0,0,107],
+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")},239,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,466,160,[],161,[]],
+nn:[function(){this.Qj()},"call$0","gH1",0,0,112],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -13442,7 +14175,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,418,[],416,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,467,[],465,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -13454,12 +14187,12 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,418,[],416,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,467,[],465,[]]},
 dq:{
 "^":"YR;Em,Sb",
 Ml:[function(a,b){var z=this.Em
 if(z>0){this.Em=z-1
-return}b.Rg(0,a)},"call$2","gOa",4,0,null,418,[],416,[]],
+return}b.Rg(0,a)},"call$2","gOa",4,0,null,467,[],465,[]],
 U6:function(a,b,c){},
 $asYR:function(a){return[a,a]},
 $asqh:null},
@@ -13491,101 +14224,101 @@
 c1:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,146,[],155,[],156,[]],
+return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,151,[],160,[],161,[]],
 Vn:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,146,[],110,[]],
+return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,151,[],115,[]],
 qG:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,146,[],110,[],168,[]],
+return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,151,[],115,[],173,[]],
 nA:[function(a,b,c,d){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,146,[],110,[],54,[],55,[]],
+return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,151,[],115,[],54,[],55,[]],
 TE:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gFh(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,146,[],110,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,151,[],115,[]],
 V6:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gXp(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,146,[],110,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,151,[],115,[]],
 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,146,[],110,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,151,[],115,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
 x=z.geT(z)
-y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,146,[],110,[]],
+y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,151,[],115,[]],
 pX:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,146,[],162,[],110,[]],
+return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,151,[],167,[],115,[]],
 RB:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,146,[],176,[]],
+y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,151,[],181,[]],
 ld:[function(a,b,c){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.giq()==null;)z=z.geT(z)
 x=z.geT(z)
-return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,146,[],179,[],180,[]]},
+return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,151,[],184,[],185,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,419,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,468,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$1","gCF",2,0,null,110,[]],
+return this.hk(z,y)}},"call$1","gSI",2,0,null,115,[]],
 m1:[function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$2","gNY",4,0,null,110,[],168,[]],
+return this.hk(z,y)}},"call$2","gNY",4,0,null,115,[],173,[]],
 z8:[function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$3","gLG",6,0,null,110,[],54,[],55,[]],
+return this.hk(z,y)}},"call$3","gLG",6,0,null,115,[],54,[],55,[]],
 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,110,[],420,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,336,115,[],469,[]],
 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,110,[],420,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,336,115,[],469,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.pV(this,z)},"call$2$runGuarded","gzg",2,3,null,333,110,[],420,[]]},
+else return new P.pV(this,z)},"call$2$runGuarded","gzg",2,3,null,336,115,[],469,[]]},
 TF:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:108;c,d",
+"^":"Tp:113;c,d",
 call$0:[function(){return this.c.Gr(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,168,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,173,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:225;c,d",
-call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,168,[],"call"],
+"^":"Tp:107;c,d",
+call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,173,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
 $isEH:true},
 pV:{
-"^":"Tp:343;c,d",
+"^":"Tp:346;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
 $isEH:true},
 uo:{
@@ -13596,23 +14329,23 @@
 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,42,[]],
-hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,155,[],156,[]],
-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,77,77,179,[],180,[]],
-Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,110,[]],
-FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,110,[],168,[]],
-mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,110,[],54,[],55,[]],
-Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,110,[]],
-cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,110,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,110,[]],
-wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,110,[]],
-uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,162,[],110,[]],
-Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,176,[]]},
+hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
+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,77,77,184,[],185,[]],
+Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,115,[]],
+FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
+mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
+Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,115,[]],
+cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,115,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,115,[]],
+wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,115,[]],
+uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
+Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,181,[]]},
 pK:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){P.IA(new P.eM(this.a,this.b))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:108;c,d",
+"^":"Tp:113;c,d",
 call$0:[function(){var z,y,x
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
@@ -13624,7 +14357,7 @@
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:385;a",
+"^":"Tp:436;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,42,[],23,[],"call"],
 $isEH:true},
@@ -13658,23 +14391,23 @@
 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,419,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,468,[]],
 t:[function(a,b){return},"call$1","gIA",2,0,null,42,[]],
-hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,155,[],156,[]],
-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,77,77,179,[],180,[]],
-Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,110,[]],
-FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,110,[],168,[]],
-mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,110,[],54,[],55,[]],
-Al:[function(a){return a},"call$1","gFh",2,0,null,110,[]],
-cR:[function(a){return a},"call$1","gXp",2,0,null,110,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,110,[]],
-wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,110,[]],
-uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,162,[],110,[]],
+hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
+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,77,77,184,[],185,[]],
+Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,115,[]],
+FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
+mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
+Al:[function(a){return a},"call$1","gFh",2,0,null,115,[]],
+cR:[function(a){return a},"call$1","gXp",2,0,null,115,[]],
+O8:[function(a){return a},"call$1","gaj",2,0,null,115,[]],
+wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,115,[]],
+uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
 Ch:[function(a,b){H.qw(b)
-return},"call$1","gJS",2,0,null,176,[]]}}],["dart.collection","dart:collection",,P,{
+return},"call$1","gJS",2,0,null,181,[]]}}],["dart.collection","dart:collection",,P,{
 "^":"",
-Ou:[function(a,b){return J.de(a,b)},"call$2","iv",4,0,182,123,[],183,[]],
-T9:[function(a){return J.v1(a)},"call$1","py",2,0,184,123,[]],
+Ou:[function(a,b){return J.de(a,b)},"call$2","iv",4,0,187,128,[],188,[]],
+T9:[function(a){return J.v1(a)},"call$1","py",2,0,189,128,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -13689,7 +14422,7 @@
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"call$1","Zw",2,0,null,109,[]],
+return y.vM},"call$1","Zw",2,0,null,114,[]],
 Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
@@ -13722,7 +14455,7 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"call$2","zE",4,0,null,109,[],185,[]],
+b.push(v)},"call$2","zE",4,0,null,114,[],190,[]],
 L5:function(a,b,c,d,e){if(b==null){if(a==null)return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])
 b=P.py()}else{if(P.J2()===b&&P.N3()===a)return H.VM(new P.ey(0,null,null,null,null,null,0),[d,e])
 if(a==null)a=P.iv()}return P.Ex(a,b,c,d,e)},
@@ -13737,7 +14470,7 @@
 J.kH(a,new P.ZQ(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"call$1","DH",2,0,null,186,[]],
+z.pop()}return y.gvM()},"call$1","DH",2,0,null,191,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -13803,7 +14536,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,378,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -13824,33 +14557,33 @@
 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,181,[],42,[],23,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
 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,181,[],42,[]],
+return z}else return},"call$2","got",4,0,null,186,[],42,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
 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,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,181,[],42,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","Nk",6,0,null,181,[],42,[],23,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,186,[],42,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,186,[],42,[],23,[]],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:225;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -13864,7 +14597,7 @@
 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,421,[],42,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
 C2:function(a,b){return this.m6.call$2(a,b)},
@@ -13881,14 +14614,14 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 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:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,274,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -13898,12 +14631,12 @@
 z=new P.EQ(z,z.Ig(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,124,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
 aN:[function(a,b){var z,y,x,w
 z=this.Fb
 y=z.Ig()
 for(x=y.length,w=0;w<x;++w){b.call$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,110,[]],
+if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,115,[]],
 $isyN:true},
 EQ:{
 "^":"a;Fb,wV,zi,fD",
@@ -13964,7 +14697,7 @@
 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,42,[],423,[]],
+return z},"call$2","gMs",4,0,null,42,[],472,[]],
 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)
@@ -13988,17 +14721,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,378,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
 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,181,[],42,[],23,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
 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,181,[],42,[]],
+return z.gS4()},"call$2","got",4,0,null,186,[],42,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14016,13 +14749,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,424,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
 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,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14031,12 +14764,12 @@
 delete z["<non-identifier-key>"]
 return z},"call$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:225;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,422,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
@@ -14050,7 +14783,7 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y].gkh()
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,421,[],42,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
 xd:{
 "^":"YB;m6,Q6,ac,X5,vv,OX,OB,H9,lX,zN",
 C2:function(a,b){return this.m6.call$2(a,b)},
@@ -14067,13 +14800,13 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(this.C2(a[y].gkh(),b)===!0)return y
-return-1},"call$2","gSP",4,0,null,421,[],42,[]],
+return-1},"call$2","gSP",4,0,null,470,[],42,[]],
 static:{Ex:function(a,b,c,d,e){var z=new P.v6(d)
 return H.VM(new P.xd(a,b,z,0,null,null,null,null,null,0),[d,e])}}},
 v6:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,274,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 db:{
 "^":"a;kh<,S4@,DG@,zQ@"},
@@ -14087,14 +14820,14 @@
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.zq=z.H9
 return y},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,124,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
 aN:[function(a,b){var z,y,x
 z=this.Fb
 y=z.H9
 x=z.zN
 for(;y!=null;){b.call$1(y.gkh())
 if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},"call$1","gjw",2,0,null,110,[]],
+y=y.gDG()}},"call$1","gjw",2,0,null,115,[]],
 $isyN:true},
 N6:{
 "^":"a;Fb,zN,zq,fD",
@@ -14152,9 +14885,9 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(b)}this.X5=this.X5+1
 this.DM=null
-return!0}},"call$1","ght",2,0,null,124,[]],
+return!0}},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,425,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
 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)
@@ -14195,17 +14928,17 @@
 a[b]=0
 this.X5=this.X5+1
 this.DM=null
-return!0},"call$2","gLa",4,0,null,181,[],124,[]],
+return!0},"call$2","gLa",4,0,null,186,[],129,[]],
 Nv:[function(a,b){if(a!=null&&a[b]!=null){delete a[b]
 this.X5=this.X5-1
 this.DM=null
-return!0}else return!1},"call$2","got",4,0,null,181,[],124,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,124,[]],
+return!0}else return!1},"call$2","got",4,0,null,186,[],129,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
 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],b))return y
-return-1},"call$2","gSP",4,0,null,421,[],124,[]],
+return-1},"call$2","gSP",4,0,null,470,[],129,[]],
 $isyN:true,
 $iscX:true,
 $ascX:null},
@@ -14216,7 +14949,7 @@
 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,421,[],124,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],129,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14260,7 +14993,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,378,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -14284,9 +15017,9 @@
 u=w[v]
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
-u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,124,[]],
+u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,425,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
 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)
@@ -14306,14 +15039,14 @@
 this.zN=this.zN+1&67108863}},"call$0","gyP",0,0,null],
 cA:[function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
-return!0},"call$2","gLa",4,0,null,181,[],124,[]],
+return!0},"call$2","gLa",4,0,null,186,[],129,[]],
 Nv:[function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
 this.Vb(z)
 delete a[b]
-return!0},"call$2","got",4,0,null,181,[],124,[]],
+return!0},"call$2","got",4,0,null,186,[],129,[]],
 xf:[function(a){var z,y
 z=new P.ef(a,null,null)
 if(this.H9==null){this.lX=z
@@ -14322,7 +15055,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$1","gTM",2,0,null,124,[]],
+return z},"call$1","gTM",2,0,null,129,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14331,13 +15064,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,424,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,124,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
 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,421,[],124,[]],
+return-1},"call$2","gSP",4,0,null,470,[],129,[]],
 $isyN:true,
 $iscX:true,
 $ascX:null},
@@ -14366,20 +15099,20 @@
 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,"gRV",0,3,null,336,337,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
 $isyN:true,
 $iscX:true,
 $ascX:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,110,[]],
-ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,110,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
+ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
 tg:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
-return!1},"call$1","gdj",2,0,null,124,[]],
+return!1},"call$1","gdj",2,0,null,129,[]],
 aN:[function(a,b){var z
-for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,110,[]],
+for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,115,[]],
 zV:[function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
@@ -14389,18 +15122,18 @@
 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","gnr",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gnr",0,2,null,333,334,[]],
 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,110,[]],
-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,[]],
+return!1},"call$1","gG2",2,0,null,115,[]],
+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,336,337,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,289,[]],
+eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,292,[]],
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(new P.lj("No elements"))
@@ -14409,7 +15142,7 @@
 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,77,379,[],426,[]],
+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,77,430,[],475,[]],
 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()
@@ -14435,7 +15168,7 @@
 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,378,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,429,[]],
 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"))
@@ -14448,21 +15181,21 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,124,[]],
+if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,129,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(a)
 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,379,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,430,[]],
 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","gnr",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,379,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,110,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,122,[]],
+return z.vM},"call$1","gnr",0,2,null,333,334,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,430,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
+eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,127,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
@@ -14475,15 +15208,15 @@
 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,"gRV",0,3,null,336,337,[]],
 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,124,[]],
+this.u(a,z,b)},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z,y,x
 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,109,[]],
+this.u(a,x,y)}},"call$1","gDY",2,0,null,114,[]],
 Rz:[function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
@@ -14491,13 +15224,13 @@
 if(!(z<y))break
 if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},"call$1","gRI",2,0,null,124,[]],
+return!0}++z}return!1},"call$1","gRI",2,0,null,129,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,77,128,[]],
+GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,77,133,[]],
 pZ:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gbI",4,0,null,115,[],116,[]],
+if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gbI",4,0,null,120,[],121,[]],
 D6:[function(a,b,c){var z,y,x,w
 if(c==null)c=this.gB(a)
 this.pZ(a,b,c)
@@ -14508,9 +15241,9 @@
 x=0
 for(;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,115,[],116,[]],
+y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,115,[],116,[]],
+return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14527,7 +15260,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,115,[],116,[],109,[],117,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14536,11 +15269,11 @@
 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,124,[],80,[]],
+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,335,129,[],80,[]],
 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,"gph",2,2,null,77,124,[],80,[]],
+return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],80,[]],
 xe:[function(a,b,c){var z
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14549,7 +15282,7 @@
 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,47,[],124,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
 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))
@@ -14567,14 +15300,14 @@
 $iscX:true,
 $ascX:null},
 ZQ:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;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,427,[],274,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,402,[],277,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -14586,7 +15319,7 @@
 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,378,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
 gl0:function(a){return this.av===this.eZ},
 gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
 grZ:function(a){var z,y
@@ -14612,8 +15345,8 @@
 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.e4(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,124,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,129,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
 if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=z.gB(b)
@@ -14639,7 +15372,7 @@
 H.Og(w,z,z+s,b,0)
 z=this.v5
 H.Og(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,428,[]],
+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,476,[]],
 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)
@@ -14662,7 +15395,7 @@
 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,124,[]],
+this.qT=this.qT+1},"call$1","gXk",2,0,null,129,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
 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
@@ -14680,7 +15413,7 @@
 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,429,[]],
+return a}},"call$1","gzv",2,0,null,477,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -14725,7 +15458,7 @@
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"call$1","W5",2,0,null,187,[]]}},
+if(z===0)return a}},"call$1","bD",2,0,null,192,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -14786,7 +15519,7 @@
 return v},"call$1","gST",2,0,null,42,[]],
 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","gOv",2,0,null,261,[]],
+y.Bb=z}return z},"call$1","gOv",2,0,null,264,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -14809,12 +15542,12 @@
 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,261,[],430,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,264,[],478,[]]},
 Ba:{
 "^":"vX;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,431,[],432,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gcd",4,0,null,479,[],480,[]],
 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
@@ -14838,7 +15571,7 @@
 y.Qf(this,[P.qv,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
-b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,110,[]],
+b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,115,[]],
 gB:function(a){return this.P6},
 V1:[function(a){this.aY=null
 this.P6=0
@@ -14859,9 +15592,9 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,274,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
@@ -14869,13 +15602,13 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 LD:{
-"^":"Tp:433;a,b,c",
+"^":"Tp:481;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,261,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,264,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -14884,7 +15617,7 @@
 return this.Wb(z)},
 WV:[function(a){var z
 for(z=this.Ln;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,261,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,264,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -14926,32 +15659,35 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,261,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,264,[]]},
 ZM:{
 "^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,261,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,264,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,261,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,264,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,188,[],189,[]],
+return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,193,[],194,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H44",4,0,null,27,[],189,[]],
-tp:[function(a){return a.Lt()},"call$1","BC",2,0,190,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H44",4,0,null,27,[],194,[]],
+tp:[function(a){return a.Lt()},"call$1","BC",2,0,195,6,[]],
+Md:[function(a){a.i(0,64512)
+return!1},"call$1","bO",2,0,null,13,[]],
+ZZ:[function(a,b){return(65536+(a.i(0,1023)<<10>>>0)|b&1023)>>>0},"call$2","hz",4,0,null,198,[],199,[]],
 JC:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 call$2:[function(a,b){return b},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -14971,18 +15707,18 @@
 "^":"Uk;",
 $asUk:function(){return[J.O,[J.Q,J.im]]}},
 Ud:{
-"^":"Ge;Ct,FN",
+"^":"Ge;Pc,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
 else return"Converting object did not return an encodable object."},"call$0","gXo",0,0,null],
 static:{ox:function(a,b){return new P.Ud(a,b)}}},
 K8:{
-"^":"Ud;Ct,FN",
+"^":"Ud;Pc,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"call$0","gXo",0,0,null],
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-pW:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.pW(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,77,27,[],189,[]],
-PN:[function(a,b){return P.Vg(a,this.gZE().Xi)},function(a){return this.PN(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,77,23,[],191,[]],
+pW:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.pW(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,77,27,[],194,[]],
+PN:[function(a,b){return P.Vg(a,this.gZE().Xi)},function(a){return this.PN(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,77,23,[],196,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
@@ -15039,11 +15775,11 @@
 w.KF("}")
 this.JN.Rz(0,a)
 return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,IE,Yz,No,fg,SW,KQz,MU,ql,NXu,CE,QVv",Vg:[function(a,b){var z
+static:{"^":"P3,Ib,IE,Yz,ij,fg,SW,KQz,MU,ql,NXu,CE,QVv",Vg:[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","ab",4,0,null,6,[],191,[]],NY:[function(a,b){var z,y,x,w,v,u,t
+return z.vM},"call$2","ab",4,0,null,6,[],196,[]],NY:[function(a,b){var z,y,x,w,v,u,t
 z=J.U6(b)
 y=z.gB(b)
 x=H.VM([],[J.im])
@@ -15073,9 +15809,9 @@
 x.push(t<10?48+t:87+t)
 break}w=!0}else if(u===34||u===92){x.push(92)
 x.push(u)
-w=!0}else x.push(u)}a.KF(w?P.HM(x):b)},"call$2","qW",4,0,null,192,[],86,[]]}},
+w=!0}else x.push(u)}a.KF(w?P.HM(x):b)},"call$2","qW",4,0,null,197,[],86,[]]}},
 tF:{
-"^":"Tp:434;a,b",
+"^":"Tp:482;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
@@ -15093,86 +15829,61 @@
 E3:{
 "^":"wI;",
 WJ:[function(a){var z,y,x
-z=J.U6(a)
-y=J.p0(z.gB(a),3)
-if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.im])
+z=a.gB(a)
+y=H.VM(Array(z.U(0,3)),[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)
+x.fJ(a,0,z)
+x.Lb(a.j(0,z.W(0,1)),0)
 return C.Nm.D6(y,0,x.ZP)},"call$1","gmC",2,0,null,26,[]],
 $aswI:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
-"^":"a;WF,ZP,EN",
-Lb:[function(a,b){var z,y,x,w,v
-z=this.EN
+"^":"a;vn,ZP,EN",
+Lb:[function(a,b){var z,y,x,w
+if((b&64512)===56320)P.ZZ(a,b)
+else{z=this.EN
 y=this.ZP
-if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
-w=y+1
-this.ZP=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=(240|x>>>18)>>>0
-y=w+1
-this.ZP=y
-if(w>=v)return H.e(z,w)
-z[w]=128|x>>>12&63
-w=y+1
-this.ZP=w
-if(y>=v)return H.e(z,y)
-z[y]=128|x>>>6&63
-this.ZP=w+1
-if(w>=v)return H.e(z,w)
-z[w]=128|x&63
-return!0}else{w=y+1
-this.ZP=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=224|a>>>12
-y=w+1
-this.ZP=y
-if(w>=v)return H.e(z,w)
-z[w]=128|a>>>6&63
 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,435,[],436,[]],
-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)
-z=this.EN
-y=z.length
-x=J.rY(a)
-w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.ZP
-if(u>=y)break
+x=C.jn.k(224,a.m(0,12))
+w=z.length
+if(y>=w)return H.e(z,y)
+z[y]=x
+x=this.ZP
+this.ZP=x+1
+y=a.m(0,6).i(0,63)
+if(x>=w)return H.e(z,x)
+z[x]=128|y
+y=this.ZP
+this.ZP=y+1
+x=a.i(0,63)
+if(y>=w)return H.e(z,y)
+z[y]=128|x
+return!1}},"call$2","gkL",4,0,null,483,[],484,[]],
+fJ:[function(a,b,c){var z,y,x,w,v,u
+P.Md(a.j(0,c.W(0,1)))
+for(z=this.EN,y=z.length,x=b;C.jn.C(x,c);++x){w=a.j(0,x)
+w.E(0,127)
+P.Md(w)
+w.E(0,2047)
+v=this.ZP
+if(v+2>=y)break
+this.ZP=v+1
+u=C.jn.k(224,w.m(0,12))
+if(v>=y)return H.e(z,v)
+z[v]=u
+u=this.ZP
 this.ZP=u+1
-z[u]=v}else if((v&64512)===55296){if(this.ZP+3>=y)break
-t=w+1
-if(this.Lb(v,x.j(a,t)))w=t}else if(v<=2047){u=this.ZP
-s=u+1
-if(s>=y)break
-this.ZP=s
+v=w.m(0,6).i(0,63)
 if(u>=y)return H.e(z,u)
-z[u]=192|v>>>6
-this.ZP=s+1
-z[s]=128|v&63}else{u=this.ZP
-if(u+2>=y)break
-s=u+1
-this.ZP=s
-if(u>=y)return H.e(z,u)
-z[u]=224|v>>>12
-u=s+1
-this.ZP=u
-if(s>=y)return H.e(z,s)
-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,[],115,[],116,[]],
+z[u]=128|v
+v=this.ZP
+this.ZP=v+1
+u=w.i(0,63)
+if(v>=y)return H.e(z,v)
+z[v]=128|u}return x},"call$3","gkH",6,0,null,339,[],120,[],121,[]],
 static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:[function(a){return},"call$1","PM",2,0,null,44,[]],
-Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,193,123,[],183,[]],
+Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,200,128,[],188,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -15198,9 +15909,9 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"call$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,195,123,[],183,[]],
-xv:[function(a){return H.CU(a)},"call$1","J2",2,0,196,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,197,77,77,27,[],159,[],28,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,202,128,[],188,[]],
+xv:[function(a){return H.CU(a)},"call$1","J2",2,0,203,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,204,77,77,27,[],164,[],28,[]],
 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
@@ -15221,15 +15932,15 @@
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.call$1(z)},"call$1","Pl",2,0,null,6,[]],
+else y.call$1(z)},"call$1","Qki",2,0,null,6,[]],
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,129,[],23,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,134,[],23,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:385;a",
+"^":"Tp:436;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -15244,7 +15955,7 @@
 "^":"a;",
 bu:[function(a){return this?"true":"false"},"call$0","gXo",0,0,null],
 $isbool:true},
-Tx:{
+Rz:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
@@ -15269,11 +15980,11 @@
 q=new P.Zl().call$1(z)
 if(y)return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)+"Z"
 else return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)},"call$0","gXo",0,0,null],
-h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,162,[]],
+h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,167,[]],
 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,h2,pa,EQe,NXt,tp1,Gi,k3,cR,E03,fH,Ne,r2,bmS,FI,Kz,EF,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+static:{"^":"aV,bI,dfk,Kw,h2,mo,EQe,NXt,tp1,Xs,k3,cR,Oq,fH,Ne,Nr,bmS,lX,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=new H.VR(H.v4("^([+-]?\\d?\\d\\d\\d\\d)-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?\\+00(?::?00)?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -15296,48 +16007,50 @@
 if(8>=x.length)return H.e(x,8)
 o=x[8]!=null
 n=H.zW(w,v,u,t,s,r,q,o)
-return P.Wu(p?n+1:n,o)}else throw H.b(P.cD(a))},"call$1","lel",2,0,null,194,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?n+1:n,o)}else throw H.b(P.cD(a))},"call$1","zZ",2,0,null,201,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
+return z},Gi:function(){var z=new P.iP(Date.now(),!1)
+z.EK()
 return z}}},
 MF:{
-"^":"Tp:438;",
+"^":"Tp:486;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,437,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:439;",
+"^":"Tp:487;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,437,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 Hn:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"call$1",null,2,0,null,289,[],"call"],
+return y+"000"+H.d(z)},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 Zl:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"call$1",null,2,0,null,289,[],"call"],
+return"00"+a},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 B5:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,289,[],"call"],
+return"0"+a},"call$1",null,2,0,null,292,[],"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,104,[]],
 W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,104,[]],
 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,440,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,488,[]],
 Z:[function(a,b){if(b===0)throw H.b(P.zl())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","gdG",2,0,null,441,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,489,[]],
 C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,104,[]],
 D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,104,[]],
 E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gf5",2,0,null,104,[]],
@@ -15361,18 +16074,18 @@
 $isa6:true,
 static:{"^":"Kl,S4d,dk,uU,RD,b2,q9,ll,Do,f4,kTB,IJZ,iI,Vk,Nw,yn",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:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
 if(a>=100)return"000"+a
 if(a>=10)return"0000"+a
-return"00000"+a},"call$1",null,2,0,null,289,[],"call"],
+return"00000"+a},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:394;",
+"^":"Tp:444;",
 call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,289,[],"call"],
+return"0"+a},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -15395,7 +16108,7 @@
 "^":"Ge;",
 static:{hS:function(){return new P.Np()}}},
 mp:{
-"^":"Ge;uF,UP,mP,SA,mZ",
+"^":"Ge;uF,UP,mP,SA,FZ",
 bu:[function(a){var z,y,x,w,v,u,t
 z={}
 z.a=P.p9("")
@@ -15475,7 +16188,7 @@
 "^":"a;",
 $iscX:true,
 $ascX:null},
-Yl:{
+AC:{
 "^":"a;"},
 Z0:{
 "^":"a;",
@@ -15488,7 +16201,7 @@
 n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,104,[]],
 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,328,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -15533,7 +16246,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","gS9",2,2,null,330,425,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gS9",2,2,null,333,474,[],334,[]],
 V1:[function(a){this.vM=""},"call$0","gyP",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
@@ -15548,7 +16261,7 @@
 "^":"a;",
 $isuq:true},
 iD:{
-"^":"a;NN,HC,r0,Fi,ku,tP,Ka,YG,yW",
+"^":"a;NN,HC,r0,Fi,ku,tP,Ka,hO,yW",
 gWu:function(){if(J.de(this.gJf(this),""))return""
 var z=P.p9("")
 this.tb(z)
@@ -15571,13 +16284,13 @@
 if(!J.de(this.gJf(this),"")||J.de(this.Fi,"file")){z=J.U6(y)
 z=z.gor(y)&&!z.nC(y,"/")}else z=!1
 if(z)return"/"+H.d(y)
-return y},"call$2","gbQ",4,0,null,262,[],442,[]],
+return y},"call$2","gbQ",4,0,null,265,[],490,[]],
 Ky:[function(a,b){var z=J.x(a)
 if(z.n(a,""))return"/"+H.d(b)
-return z.Nj(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},"call$2","gAj",4,0,null,443,[],444,[]],
+return z.Nj(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},"call$2","gAj",4,0,null,491,[],492,[]],
 uo:[function(a){var z=J.U6(a)
 if(J.z8(z.gB(a),0)&&z.j(a,0)===58)return!0
-return z.u8(a,"/.")!==-1},"call$1","gaO",2,0,null,262,[]],
+return z.u8(a,"/.")!==-1},"call$1","gaO",2,0,null,265,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
@@ -15590,13 +16303,13 @@
 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,262,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,265,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}z=this.NN
 a.KF(z==null?"null":z)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,445,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,493,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
@@ -15621,7 +16334,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"Um,B4,Bx,iR,OO,My,nR,jJY,d2,Qq,q7,ux,zk,SF,fd,IL,Q5,Pa,yt,fC,O5,eq,qf,ML,y3,Pk,R1,qs,lL,I9,t2,H5,wb,eK,ws,Sp,jH,Qd,Ai,ne",r6:function(a){var z,y,x,w,v,u,t,s
+static:{"^":"Um,B4,Bx,iR,OO,My,nR,jJY,d2,n2,q7,ux,vI,SF,fd,IL,Q5,zk,yt,fC,Ft,eq,qf,ML,y3,Pk,R1,qs,lL,I9,t2,H5,wb,eK,ws,Sp,aJ,Qd,Ai,ne",r6:function(a){var z,y,x,w,v,u,t,s
 z=a.QK
 if(1>=z.length)return H.e(z,1)
 y=z[1]
@@ -15662,7 +16375,7 @@
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
 if(z.j(a,y)===58){P.eg(a)
-return"["+H.d(a)+"]"}++y}return a},"call$1","jC",2,0,null,198,[]],iy:[function(a){var z,y,x,w,v,u,t,s
+return"["+H.d(a)+"]"}++y}return a},"call$1","jC",2,0,null,205,[]],iy:[function(a){var z,y,x,w,v,u,t,s
 z=new P.hb()
 y=new P.XX()
 if(a==null)return""
@@ -15677,7 +16390,7 @@
 s=!s}else s=!1
 if(s)throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
 if(z.call$1(t)!==!0){if(y.call$1(t)===!0);else throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
-v=!1}}return v?a:x.hc(a)},"call$1","oL",2,0,null,199,[]],LE:[function(a,b){var z,y,x
+v=!1}}return v?a:x.hc(a)},"call$1","oL",2,0,null,206,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -15686,8 +16399,8 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"call$2","wF",4,0,null,200,[],201,[]],UJ:[function(a){if(a==null)return""
-return P.Xc(a)},"call$1","p7",2,0,null,202,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return x.vM},"call$2","wF",4,0,null,207,[],208,[]],UJ:[function(a){if(a==null)return""
+return P.Xc(a)},"call$1","p7",2,0,null,209,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z={}
 y=new P.Gs()
 x=new P.Tw()
@@ -15734,14 +16447,14 @@
 r=n}if(z.a!=null&&z.c!==r)s.call$0()
 z=z.a
 if(z==null)return a
-return J.AG(z)},"call$1","Sy",2,0,null,203,[]],n7:[function(a){if(a!=null&&!J.de(a,""))return H.BU(a,null,null)
-else return 0},"call$1","dl",2,0,null,204,[]],K6:[function(a,b){if(a!=null)return a
+return J.AG(z)},"call$1","Sy",2,0,null,210,[]],n7:[function(a){if(a!=null&&!J.de(a,""))return H.BU(a,null,null)
+else return 0},"call$1","dl",2,0,null,211,[]],K6:[function(a,b){if(a!=null)return a
 if(b!=null)return b
-return""},"call$2","xX",4,0,null,205,[],206,[]],q5:[function(a){var z,y
+return""},"call$2","xX",4,0,null,212,[],213,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.call$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,198,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,205,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.u6(J.q8(a),2))z.call$1("address is too short")
@@ -15762,7 +16475,7 @@
 q=J.de(J.MQ(x),-1)
 if(r&&!q)z.call$1("expected a part after last `:`")
 if(!r)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(p){H.Ru(p)
-try{v=P.q5(J.ZZ(a,w))
+try{v=P.q5(J.D8(a,w))
 s=J.c1(J.UQ(v,0),8)
 o=J.UQ(v,1)
 if(typeof o!=="number")return H.s(o)
@@ -15774,7 +16487,7 @@
 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","y9",2,0,null,198,[]],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,205,[]],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)
@@ -15790,29 +16503,29 @@
 y.vM=y.vM+u}else{s=P.O8(1,37,J.im)
 u=H.eT(s)
 y.vM=y.vM+u
-z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,207,147,208,[],209,[],210,[],211,[]]}},
+z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,214,152,215,[],216,[],217,[],218,[]]}},
 hb:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 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,446,[],"call"],
+return z},"call$1",null,2,0,null,494,[],"call"],
 $isEH:true},
 XX:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.mK,z)
 z=(C.mK[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,446,[],"call"],
+return z},"call$1",null,2,0,null,494,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -15823,26 +16536,26 @@
 z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 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,448,[],"call"],
+return z},"call$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:447;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:495;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,496,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:447;",
+"^":"Tp:495;",
 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,446,[],"call"],
+return z},"call$1",null,2,0,null,494,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:449;b,c,d",
+"^":"Tp:497;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=J.lE(z,a)
@@ -15851,7 +16564,7 @@
 else return y},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:449;e",
+"^":"Tp:497;e",
 call$1:[function(a){var z,y,x,w,v
 for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
 if(48<=v&&v<=57)x=x*16+v-48
@@ -15860,7 +16573,7 @@
 else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+H.d(z)))}}return x},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:107;a,f",
+"^":"Tp:112;a,f",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.a
@@ -15871,54 +16584,54 @@
 else y.KF(J.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:451;",
+"^":"Tp:499;",
 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,450,[],242,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,498,[],245,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:177;",
+"^":"Tp:182;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,452,[],"call"],
+return z},"call$1",null,2,0,null,500,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:177;",
+"^":"Tp:182;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:453;a,b",
+"^":"Tp:501;a,b",
 call$2:[function(a,b){var z,y
 if(J.z8(J.xH(b,a),4))this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(J.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.call$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"call$2",null,4,0,null,115,[],116,[],"call"],
+return z},"call$2",null,4,0,null,120,[],121,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:225;c",
+"^":"Tp:107;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,23,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 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,454,[],455,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,502,[],503,[],"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,212,18,[]],
-r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,94,[],213,[]],
-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,77,77,214,[],215,[],216,[]],
+return"transitionend"},"call$1","pq",2,0,219,18,[]],
+r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,94,[],220,[]],
+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,77,77,221,[],222,[],223,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -15929,7 +16642,7 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,77,77,77,77,77,77,77,214,[],217,[],218,[],215,[],219,[],220,[],221,[],216,[]],
+return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,77,77,77,77,77,77,77,221,[],224,[],225,[],222,[],226,[],227,[],228,[],223,[]],
 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},
@@ -15937,9 +16650,9 @@
 try{z=a
 y=J.x(z)
 return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","iJ",2,0,null,222,[]],
+return!1}},"call$1","EF",2,0,null,229,[]],
 Pv:[function(a){if(a==null)return
-return W.P1(a)},"call$1","Ie",2,0,null,223,[]],
+return W.P1(a)},"call$1","Ie",2,0,null,230,[]],
 qc:[function(a){var z,y
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
@@ -15947,10 +16660,13 @@
 if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
 return}else return a},"call$1","Wq",2,0,null,18,[]],
 qr:[function(a){return a},"call$1","Ku",2,0,null,18,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,224,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,225,41,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,225,41,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,226,41,[],12,[],227,[],228,[]],
+Z9:[function(a){var z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+return P.o7(a,!0)},"call$1","cj",2,0,null,91,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,231,[],7,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,107,41,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,107,41,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,232,41,[],12,[],233,[],234,[]],
 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))
@@ -15989,16 +16705,16 @@
 Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
 q={prototype: s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"call$5","uz",10,0,null,89,[],229,[],94,[],11,[],230,[]],
+b.registerElement(c,q)},"call$5","uz",10,0,null,89,[],235,[],94,[],11,[],236,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,151,[]],
+return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,156,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,151,[]],
+return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,156,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|LP|uL|Vf|G6|Ds|xI|Tg|pv|Ps|CN|Vfx|vc|Dsd|E0|Nr|lw|tuj|Fv|Vct|E9|m8|D13|Gk|AX|WZq|yb|pva|NM|pR|cda|hx|u7|waa|E7|V0|St|V4|vj|LU|V10|T2|PF|F1|V11|aQ|V12|Qa|V13|vI|V14|tz|V15|fl|V16|Zt|V17|wM|V18|lI|XP|JG|T5|knI|V19|fI|V20|nm|V21|Vu"},
-ho:{
+"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Vf|PO|Ur|G6|Sq|xI|Tg|KU|Ps|CN|qbd|HT|Ds|E0|LP|lw|pv|Fv|Vfx|E9|m8|Urj|Gk|AX|oub|yb|c4r|NM|pR|Squ|hx|Dsd|Zt|u7|KUl|E7|Kz|tuj|vj|LU|mHk|T2|Vct|PF|F1|D13|aQ|WZq|Ya5|pva|Ww|cda|tz|qFb|fl|rna|oM|Vba|wM|waa|lI|XP|V0|JG|T5|knI|oaa|fI|q2|nm|q3|uwf"},
+pa:{
 "^":"Gv;",
 $isList:true,
 $asWO:function(){return[W.M5]},
@@ -16039,11 +16755,11 @@
 "^":"KV;Rn:data=,B:length=",
 $isGv:true,
 "%":"Comment;CharacterData"},
-QQS:{
+Yr:{
 "^":"ea;tT:code=",
 "%":"CloseEvent"},
 di:{
-"^":"Mf;Rn:data=",
+"^":"Qa;Rn:data=",
 "%":"CompositionEvent"},
 He:{
 "^":"ea;",
@@ -16058,14 +16774,14 @@
 QF:{
 "^":"KV;",
 JP:[function(a){return a.createDocumentFragment()},"call$0","gf8",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,290,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,77,261,[],291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,77,264,[],294,[]],
 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,292,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,293,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,293,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16078,9 +16794,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,292,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,293,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,293,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
 $isGv:true,
 "%":";DocumentFragment"},
 cm:{
@@ -16096,7 +16812,7 @@
 $isNh:true,
 "%":"DOMException"},
 cv:{
-"^":"KV;xr:className%,jO:id%",
+"^":"KV;xr:className%,jO:id=",
 gQg:function(a){return new W.i7(a)},
 gwd:function(a){return new W.VG(a,a.children)},
 swd:function(a,b){var z,y
@@ -16104,13 +16820,13 @@
 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,292,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,293,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,293,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
 gDD:function(a){return new W.I4(a)},
 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,[],227,[],228,[]],
+aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
 gqn:function(a){return a.localName},
 bu:[function(a){return a.localName},"call$0","gXo",0,0,null],
 WO:[function(a,b){if(!!a.matches)return a.matches(b)
@@ -16118,11 +16834,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,292,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,295,[]],
 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,292,[]],
+return!1},"call$1","gMn",2,0,null,295,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
 gKE:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
@@ -16148,8 +16864,8 @@
 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,77,11,[],294,[],295,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,77,11,[],294,[],295,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16162,7 +16878,7 @@
 Aa:{
 "^":"cm;tT:code=",
 "%":"FileError"},
-h4:{
+Tq:{
 "^":"qE;B:length=,bP:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
 wa:{
@@ -16187,8 +16903,9 @@
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
 "^":"rk;iC:responseText=,ys:status=,po:statusText=",
-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,"gcY",4,7,null,77,77,77,217,[],214,[],296,[],297,[],298,[]],
-wR:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,77,233,[]],
+gn9:function(a){return W.Z9(a.response)},
+Yh:[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,77,77,77,224,[],221,[],299,[],300,[],301,[]],
+wR:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,77,239,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
 rk:{
@@ -16258,10 +16975,10 @@
 Rv:{
 "^":"D0;jO:id=",
 "%":"MediaStream"},
-DD:{
+Hy:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$isDD:true,
+$isHy:true,
 "%":"MessageEvent"},
 EeC:{
 "^":"qE;jb:content=,oc:name%",
@@ -16275,16 +16992,16 @@
 "%":"MIDIMessageEvent"},
 bn:{
 "^":"Imr;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"wR","call$2",null,"gX8",2,2,null,77,233,[],299,[]],
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"wR","call$2",null,"gX8",2,2,null,77,239,[],302,[]],
 "%":"MIDIOutput"},
 Imr:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
-Oq:{
-"^":"Mf;",
+CX:{
+"^":"Qa;",
 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,[],300,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[]],
-$isOq:true,
+return},"call$15","gEx",30,0,null,11,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[]],
+$isCX:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -16297,9 +17014,9 @@
 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,77,77,77,77,77,77,77,74,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[]],
+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,77,77,77,77,77,77,77,74,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
-o4:{
+FI:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
 oU:{
@@ -16316,13 +17033,13 @@
 if(z!=null)z.removeChild(a)},"call$0","gRI",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,321,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,324,[]],
 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,322,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,325,[]],
 tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,104,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,322,[],323,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,322,[],324,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,325,[],326,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,325,[],327,[]],
 $isKV:true,
 "%":"Entity|Notation;Node"},
 yk:{
@@ -16395,13 +17112,13 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,290,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
 $isI0:true,
 "%":"ShadowRoot"},
 CY:{
 "^":"qE;LA:src=,t5:type%",
 "%":"HTMLSourceElement"},
-zD9:{
+Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
 G5:{
@@ -16421,7 +17138,7 @@
 "^":"qE;",
 $istV:true,
 "%":"HTMLTableRowElement"},
-BT:{
+KP:{
 "^":"qE;",
 gWT:function(a){return H.VM(new W.Of(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
@@ -16439,7 +17156,7 @@
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 xV:{
-"^":"Mf;Rn:data=",
+"^":"Qa;Rn:data=",
 "%":"TextEvent"},
 RH:{
 "^":"qE;fY:kind%,LA:src=",
@@ -16448,7 +17165,7 @@
 "^":"ea;",
 $isOJ:true,
 "%":"TransitionEvent|WebKitTransitionEvent"},
-Mf:{
+Qa:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
 u9:{
@@ -16457,7 +17174,7 @@
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
-oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,151,[]],
+oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,156,[]],
 hr:[function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
@@ -16478,7 +17195,7 @@
 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,77,20,[],325,[],326,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,77,20,[],328,[],329,[]],
 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)},
@@ -16522,16 +17239,16 @@
 "%":"MozNamedAttrMap|NamedNodeMap"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gOu",2,0,456,168,[]],
-Wt:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,456,168,[]],
-To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,168,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,177,457,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,177,457,[]],
-WL:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,456,168,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,504,173,[]],
+Wt:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,504,173,[]],
+To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,173,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,182,505,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,182,505,[]],
+WL:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,504,173,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
-tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,124,[]],
+tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,129,[]],
 gl0:function(a){return this.MW.firstElementChild==null},
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
@@ -16547,9 +17264,9 @@
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
 z=J.x(b)
-for(z=J.GP(typeof b==="object"&&b!==null&&!!z.$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,109,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,77,128,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
+for(z=J.GP(typeof b==="object"&&b!==null&&!!z.$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,77,133,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 Rz:[function(a,b){var z=J.x(b)
 if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
@@ -16561,7 +17278,7 @@
 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,47,[],124,[]],
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,47,[],129,[]],
 V1:[function(a){this.MW.textContent=""},"call$0","gyP",0,0,null],
 KI:[function(a,b){var z,y
 z=this.vG
@@ -16583,7 +17300,7 @@
 return z[b]},"call$1","gIA",2,0,null,47,[]],
 u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,47,[],23,[]],
 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,77,128,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,77,133,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
 gi9:function(a){return C.mt.vo(this)},
@@ -16600,7 +17317,7 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
 return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
@@ -16632,15 +17349,15 @@
 $iscX:true,
 $ascX:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:225;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,458,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,506,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,459,[],23,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,507,[],23,[],"call"],
 $isEH:true},
 bU:{
-"^":"Tp:225;b,c",
+"^":"Tp:107;b,c",
 call$1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -16652,7 +17369,7 @@
 y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:343;a",
+"^":"Tp:346;a",
 call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 e7:{
@@ -16666,7 +17383,7 @@
 if(typeof b==="object"&&b!==null&&!!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,109,[]],
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
 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))
 z=this.NL
@@ -16674,7 +17391,7 @@
 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,47,[],261,[]],
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,47,[],264,[]],
 KI:[function(a,b){var z,y,x
 z=this.NL
 y=z.childNodes
@@ -16695,8 +17412,8 @@
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,47,[],23,[]],
 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,77,128,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,77,133,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 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
@@ -16721,7 +17438,7 @@
 $iscX:true,
 $ascX:function(){return[W.KV]}},
 kI:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
 return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
@@ -16748,7 +17465,7 @@
 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","gyP",0,0,null],
 aN:[function(a,b){var z,y
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,110,[]],
+b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,115,[]],
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[J.O])
@@ -16766,8 +17483,8 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,427,[],274,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,402,[],277,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -16780,7 +17497,7 @@
 z.removeAttribute(b)
 return y},"call$1","gRI",2,0,null,42,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,261,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,264,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16788,38 +17505,38 @@
 return z},"call$0","gt8",0,0,null],
 p5:[function(a){var z,y
 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,86,[]],
-OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,110,[]],
-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,77,23,[],460,[]],
+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","gpJ",2,0,null,86,[]],
+OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,115,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
 Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","gRI",2,0,null,23,[]],
-xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,110,[]],
+xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,115,[]],
 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)
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;a,b",
 call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:343;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,461,[],124,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,509,[],129,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -16828,36 +17545,36 @@
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 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,86,[]]},
+J.Pw(this.MW,a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]},
 e0:{
 "^":"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,147,18,[],295,[]],
-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,147,18,[],295,[]],
-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,147,18,[],295,[]]},
+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,152,18,[],298,[]],
+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,152,18,[],298,[]],
+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,152,18,[],298,[]]},
 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,77,77,77,412,[],406,[],413,[],159,[]]},
+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,77,77,77,461,[],456,[],462,[],164,[]]},
 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,462,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
 $isqh:true},
 ie:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,410,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,18,[],"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,462,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
 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)
@@ -16865,14 +17582,14 @@
 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,77,77,77,412,[],406,[],413,[],159,[]],
+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,77,77,77,461,[],456,[],462,[],164,[]],
 $isqh:true},
 i2:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,410,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
@@ -16885,7 +17602,7 @@
 return},"call$0","gZS",0,0,null],
 nB:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,409,[]],
+this.Ns()},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -16900,32 +17617,32 @@
 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.gXB()))},"call$1","ght",2,0,null,463,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gXB()))},"call$1","ght",2,0,null,511,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","gRI",2,0,null,463,[]],
+if(z!=null)z.ed()},"call$1","gRI",2,0,null,511,[]],
 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)
-this.aV.cO(0)},"call$0","gJK",0,0,107],
+this.aV.cO(0)},"call$0","gJK",0,0,112],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:108;a,b",
+"^":"Tp:113;a,b",
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-bO:{
-"^":"a;Vy",
-cN:function(a){return this.Vy.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,147,18,[],295,[]]},
+hP:{
+"^":"a;vm",
+cN:function(a){return this.vm.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,152,18,[],298,[]]},
 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,23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,109,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,77,128,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,47,[],124,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,464,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,114,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,77,133,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,47,[],129,[]],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,512,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gRI",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,115,[],116,[],109,[],117,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isList:true,
 $asWO:null,
 $isyN:true,
@@ -16935,8 +17652,8 @@
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,124,[]],
-Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","gRI",2,0,null,124,[]],
+h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,129,[]],
+Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","gRI",2,0,null,129,[]],
 V1:[function(a){J.U2(this.xa)},"call$0","gyP",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -16945,12 +17662,12 @@
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
 sB:function(a,b){J.wg(this.xa,b)},
-GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,77,128,[]],
-XU:[function(a,b,c){return J.hf(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,124,[],115,[]],
-Pk:[function(a,b,c){return J.pB(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,124,[],115,[]],
-xe:[function(a,b,c){return J.Nv(this.xa,b,c)},"call$2","gQG",4,0,null,47,[],124,[]],
+GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,77,133,[]],
+XU:[function(a,b,c){return J.hf(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],120,[]],
+Pk:[function(a,b,c){return J.pB(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
+xe:[function(a,b,c){return J.Nv(this.xa,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
 KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){J.QQ(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]]},
+YW:[function(a,b,c,d,e){J.QQ(this.xa,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -16967,7 +17684,7 @@
 return!1},"call$0","gqy",0,0,null],
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;a,b",
 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
@@ -16977,14 +17694,14 @@
 "^":"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,77,20,[],325,[],326,[]],
+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,77,20,[],328,[],329,[]],
 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,77,11,[],294,[],295,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,77,11,[],294,[],295,[]],
+On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
+Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
 $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,231,[]]}},
+else return new W.dW(a)},"call$1","lG",2,0,null,237,[]]}},
 Dk:{
 "^":"a;WK",
 gcC:function(a){return this.WK.hash},
@@ -17051,7 +17768,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDiffuseLightingElement"},
-kK:{
+wf:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDisplacementMapElement"},
@@ -17079,11 +17796,11 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEOffsetElement"},
-um:{
+kK:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFESpecularLightingElement"},
-kL:{
+um:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFETileElement"},
@@ -17138,7 +17855,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolygonElement"},
-GH:{
+mO:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolylineElement"},
@@ -17146,7 +17863,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGRectElement"},
-nd:{
+j24:{
 "^":"d5;t5:type%,mH:href=",
 $isGv:true,
 "%":"SVGScriptElement"},
@@ -17169,7 +17886,7 @@
 "%":"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"},
 hy:{
 "^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,290,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
 $ishy:true,
 $isGv:true,
 "%":"SVGSVGElement"},
@@ -17228,7 +17945,7 @@
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},"call$0","gt8",0,0,null],
-p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gVH",2,0,null,86,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
 TM:{
 "^":"Gv;tT:code=,G1:message=",
@@ -17239,11 +17956,11 @@
 $isIU:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","Kc",2,3,null,147,110,[],232,[]],
+xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","Kc",2,3,null,152,115,[],238,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-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,151,[],232,[],164,[],82,[]],
+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,156,[],238,[],169,[],82,[]],
 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,91,[],12,[],23,[]],
@@ -17260,10 +17977,10 @@
 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())
-else return P.hE(a,"_$dart_jsObject",new P.Hp())}}},"call$1","En",2,0,225,91,[]],
+else return P.hE(a,"_$dart_jsObject",new P.Hp())}}},"call$1","En",2,0,107,91,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","nB",6,0,null,91,[],63,[],234,[]],
+P.Dm(a,b,z)}return z},"call$3","nB",6,0,null,91,[],63,[],240,[]],
 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)
@@ -17271,13 +17988,13 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getMilliseconds(),!1)
 else if(a.constructor===DartObject)return a.o
-else return P.ND(a)}},"call$1","Xl",2,0,190,91,[]],
+else return P.ND(a)}},"call$1","Xl",2,0,195,91,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,91,[]],
 iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,91,[],63,[],234,[]],
+P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,91,[],63,[],240,[]],
 E4:{
 "^":"a;eh",
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
@@ -17297,7 +18014,7 @@
 V7:[function(a,b){var z,y
 z=this.eh
 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,77,217,[],265,[]],
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gwK",2,2,null,77,224,[],268,[]],
 $isE4:true,
 static:{uw:function(a,b){var z,y,x
 z=P.wY(a)
@@ -17307,9 +18024,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,233,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,239,[]]}},
 Gn:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -17347,13 +18064,13 @@
 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,23,[]],
-FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,114,[]],
 xe:[function(a,b,c){var z
 if(b>=0){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
 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,47,[],124,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,47,[],129,[]],
 KI:[function(a,b){this.fz(0,b)
 return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,47,[]],
 YW:[function(a,b,c,d,e){var z,y,x
@@ -17371,8 +18088,8 @@
 z.$builtinTypeInfo=[null]
 if(e<0)H.vh(P.N(e))
 C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
-GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,77,128,[]]},
+this.V7("splice",x)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,77,133,[]]},
 Wk:{
 "^":"E4+lD;",
 $isList:true,
@@ -17381,25 +18098,25 @@
 $iscX:true,
 $ascX:null},
 DV:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new DartObject(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -17412,7 +18129,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","yT",4,0,null,123,[],183,[]],
+return a}return a},"call$2","yT",4,0,null,128,[],188,[]],
 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
@@ -17420,7 +18137,7 @@
 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","Yr",4,0,null,123,[],183,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,128,[],188,[]]}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
@@ -17477,8 +18194,8 @@
 $isRY:true,
 $isNL:true,
 $isej:true},
-WS4:{
-"^":"a;ew,yz,nV,V3"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+Lw:{
+"^":"a;ew,yz,nV,Li"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","A9",0,0,null],
 Gj:{
@@ -17501,7 +18218,7 @@
 V1:[function(a){this.EV.V1(0)},"call$0","gyP",0,0,null],
 x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,42,[]],
 di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
@@ -17523,24 +18240,24 @@
 gbx:function(a){return C.PT},
 $isWZ:true,
 "%":"ArrayBuffer"},
-rn:{
+pF:{
 "^":"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,47,[],327,[]],
-XL:[function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.J2(a,b,c)},"call$2","gDR",4,0,null,47,[],327,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,47,[],330,[]],
+XL:[function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.J2(a,b,c)},"call$2","gDR",4,0,null,47,[],330,[]],
 PZ:[function(a,b,c,d){var z=d+1
 this.XL(a,b,z)
 if(c==null)return d
 this.XL(a,c,z)
 if(typeof c!=="number")return H.s(c)
 if(b>c)throw H.b(P.TE(b,0,c))
-return c},"call$3","gyD",6,0,null,115,[],116,[],327,[]],
-$isrn:true,
+return c},"call$3","gyD",6,0,null,120,[],121,[],330,[]],
+$ispF:true,
 $isHY:true,
 "%":";ArrayBufferView;LZ|Ob|Ip|Dg|Nb|nA|Pg"},
 df:{
-"^":"rn;",
+"^":"pF;",
 gbx:function(a){return C.T1},
 $isHY:true,
 "%":"DataView"},
@@ -17553,7 +18270,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.GW]},
 $isyN:true,
@@ -17570,7 +18287,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.GW]},
 $isyN:true,
@@ -17587,7 +18304,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17604,7 +18321,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17621,7 +18338,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17638,7 +18355,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17655,7 +18372,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17673,7 +18390,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17691,7 +18408,7 @@
 u:[function(a,b,c){var z=a.length
 if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
 a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-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,77,115,[],116,[]],
+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,77,120,[],121,[]],
 $isList:true,
 $asWO:function(){return[J.im]},
 $isyN:true,
@@ -17700,7 +18417,7 @@
 $isHY:true,
 "%":";Uint8Array"},
 LZ:{
-"^":"rn;",
+"^":"pF;",
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
 z=a.length+1
@@ -17713,13 +18430,13 @@
 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,115,[],116,[],27,[],117,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,120,[],121,[],27,[],122,[]],
 $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,115,[],116,[],109,[],117,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isDg:true,
 $isList:true,
 $asWO:function(){return[J.GW]},
@@ -17739,7 +18456,7 @@
 "^":"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,115,[],116,[],109,[],117,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
 $isPg:true,
 $isList:true,
 $asWO:function(){return[J.im]},
@@ -17760,12 +18477,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","XU",2,0,null,26,[]]}],["disassembly_entry_element","package:observatory/src/observatory_elements/disassembly_entry.dart",,E,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,26,[]]}],["disassembly_entry_element","package:observatory/src/elements/disassembly_entry.dart",,E,{
 "^":"",
 Fv:{
-"^":["tuj;F8%-465,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gNI:[function(a){return a.F8},null,null,1,0,466,"instruction",353,354],
-sNI:[function(a,b){a.F8=this.ct(a,C.i6,a.F8,b)},null,null,3,0,467,23,[],"instruction",353],
+"^":["pv;m0%-513,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gkX:[function(a){return a.m0},null,null,1,0,514,"instruction",355,397],
+skX:[function(a,b){a.m0=this.ct(a,C.i6,a.m0,b)},null,null,3,0,515,23,[],"instruction",355],
 "@":function(){return[C.Vy]},
 static:{AH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17778,16 +18495,16 @@
 a.X0=w
 C.er.ZL(a)
 C.er.G6(a)
-return a},null,null,0,0,108,"new DisassemblyEntryElement$created"]}},
-"+DisassemblyEntryElement":[468],
-tuj:{
+return a},null,null,0,0,113,"new DisassemblyEntryElement$created"]}},
+"+DisassemblyEntryElement":[516],
+pv:{
 "^":"uL+Pi;",
-$isd3:true}}],["error_view_element","package:observatory/src/observatory_elements/error_view.dart",,F,{
+$isd3:true}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["Vct;Py%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gkc:[function(a){return a.Py},null,null,1,0,352,"error",353,354],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,355,23,[],"error",353],
+"^":["Vfx;Py%-410,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gkc:[function(a){return a.Py},null,null,1,0,354,"error",355,397],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,357,23,[],"error",355],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17800,14 +18517,14 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.G6(a)
-return a},null,null,0,0,108,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[469],
-Vct:{
+return a},null,null,0,0,113,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[517],
+Vfx:{
 "^":"uL+Pi;",
-$isd3:true}}],["field_ref_element","package:observatory/src/observatory_elements/field_ref.dart",,D,{
+$isd3:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.E6]},
 static:{Tt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17816,22 +18533,20 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.MC.ZL(a)
 C.MC.G6(a)
-return a},null,null,0,0,108,"new FieldRefElement$created"]}},
-"+FieldRefElement":[362]}],["field_view_element","package:observatory/src/observatory_elements/field_view.dart",,A,{
+return a},null,null,0,0,113,"new FieldRefElement$created"]}},
+"+FieldRefElement":[418]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["D13;vt%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gt0:[function(a){return a.vt},null,null,1,0,352,"field",353,354],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,355,23,[],"field",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.vt,"id"))
-a.hm.gDF().fB(z).ml(new A.e5(a)).OA(new A.Ni()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-"@":function(){return[C.Tq]},
+"^":["Urj;vt%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gt0:[function(a){return a.vt},null,null,1,0,354,"field",355,397],
+st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,357,23,[],"field",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.vt,"id")).ml(new A.e5(a)).OA(new A.Ni()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+"@":function(){return[C.vc]},
 static:{cY:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -17843,50 +18558,48 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.G6(a)
-return a},null,null,0,0,108,"new FieldViewElement$created"]}},
-"+FieldViewElement":[470],
-D13:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new FieldViewElement$created"]}},
+"+FieldViewElement":[518],
+Urj:{
+"^":"PO+Pi;",
 $isd3:true},
 e5:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.svt(z,y.ct(z,C.WQ,y.gvt(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.svt(z,y.ct(z,C.WQ,y.gvt(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+FieldViewElement_refresh_closure":[358],
+"+FieldViewElement_refresh_closure":[415],
 Ni:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+FieldViewElement_refresh_closure":[358]}],["function_ref_element","package:observatory/src/observatory_elements/function_ref.dart",,U,{
+"+FieldViewElement_refresh_closure":[415]}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 AX:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.YQ]},
-static:{v9:[function(a){var z,y,x,w
+static:{wH:[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.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.G6(a)
-return a},null,null,0,0,108,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[362]}],["function_view_element","package:observatory/src/observatory_elements/function_view.dart",,N,{
+return a},null,null,0,0,113,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[418]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 yb:{
-"^":["WZq;Z8%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gMj:[function(a){return a.Z8},null,null,1,0,352,"function",353,354],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,355,23,[],"function",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.Z8,"id"))
-a.hm.gDF().fB(z).ml(new N.QR(a)).OA(new N.Yx()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["oub;Z8%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gMj:[function(a){return a.Z8},null,null,1,0,354,"function",355,397],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,357,23,[],"function",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.Z8,"id")).ml(new N.QR(a)).OA(new N.Yx()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17897,58 +18610,58 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.Yu.ZL(a)
-C.Yu.G6(a)
-return a},null,null,0,0,108,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[471],
-WZq:{
-"^":"uL+Pi;",
+C.h4.ZL(a)
+C.h4.G6(a)
+return a},null,null,0,0,113,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[519],
+oub:{
+"^":"PO+Pi;",
 $isd3:true},
 QR:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sZ8(z,y.ct(z,C.nf,y.gZ8(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sZ8(z,y.ct(z,C.nf,y.gZ8(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+FunctionViewElement_refresh_closure":[358],
+"+FunctionViewElement_refresh_closure":[415],
 Yx:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+FunctionViewElement_refresh_closure":[358]}],["heap_profile_element","package:observatory/src/observatory_elements/heap_profile.dart",,K,{
+"+FunctionViewElement_refresh_closure":[415]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 NM:{
-"^":["pva;GQ%-77,J0%-77,Oc%-77,CO%-77,bV%-77,vR%-77,LY%-77,q3%-77,Ol%-349,X3%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gB1:[function(a){return a.Ol},null,null,1,0,352,"profile",353,354],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,355,23,[],"profile",353],
+"^":["c4r;GQ%-77,J0%-77,Oc%-77,CO%-77,bV%-77,kg%-77,LY%-77,q3%-77,Ol%-410,X3%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gB1:[function(a){return a.Ol},null,null,1,0,354,"profile",355,397],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,357,23,[],"profile",355],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
-y=new L.qu(null,P.L5(null,null,null,null,null))
-y.YZ=P.uw(J.UQ($.NR,"Table"),[z])
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.vR=P.uw(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 L.qu(null,P.L5(null,null,null,null,null))
-z.YZ=P.uw(J.UQ($.NR,"PieChart"),[y])
+z=new G.qu(null,P.L5(null,null,null,null,null))
+z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
 a.J0=z
 z.bG.u(0,"title","New Space")
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-y=new L.qu(null,P.L5(null,null,null,null,null))
-y.YZ=P.uw(J.UQ($.NR,"PieChart"),[z])
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
 a.CO=y
 y.bG.u(0,"title","Old Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
-z=new L.qu(null,P.L5(null,null,null,null,null))
-z.YZ=P.uw(J.UQ($.NR,"Table"),[y])
-a.vR=z
+z=new G.qu(null,P.L5(null,null,null,null,null))
+z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+a.kg=z
 z.bG.u(0,"allowHtml",!0)
-J.kW(J.wc(a.vR),"sortColumn",1)
-J.kW(J.wc(a.vR),"sortAscending",!1)
-this.uB(a)},"call$0","gQd",0,0,107,"enteredView"],
+J.kW(J.wc(a.kg),"sortColumn",1)
+J.kW(J.wc(a.kg),"sortAscending",!1)
+this.uB(a)},"call$0","gQd",0,0,112,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
 if(z!=null){z=J.UQ(z,"members")
@@ -17961,9 +18674,9 @@
 if(this.K1(a,x))continue
 y=J.U6(x)
 w=J.UQ(y.t(x,"class"),"name")
-v=a.hm.gZ6().kP(J.UQ(y.t(x,"class"),"id"))
+v=a.pC.Mq(J.UQ(y.t(x,"class"),"id"))
 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()
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.Wj(a,x,0))+"</a>",this.Wj(a,x,1),this.Wj(a,x,2),this.Wj(a,x,3),this.Wj(a,x,4),this.Wj(a,x,5),this.Wj(a,x,6)])}a.GQ.lb()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
@@ -17973,21 +18686,21 @@
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
 J.N5(a.Oc,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
-this.uB(a)},"call$0","gYs",0,0,107,"_updateChartData"],
-uB:[function(a){if(a.q3==null||a.vR==null)return
-a.vR.u5()
-a.vR.W2(a.bV)
+this.uB(a)},"call$0","gYs",0,0,112,"_updateChartData"],
+uB:[function(a){if(a.q3==null||a.kg==null)return
+a.kg.u5()
+a.kg.W2(a.bV)
 a.q3.u5()
 a.q3.W2(a.LY)
 a.J0.W2(a.GQ)
-a.CO.W2(a.Oc)},"call$0","goI",0,0,107,"_draw"],
+a.CO.W2(a.Oc)},"call$0","goI",0,0,112,"_draw"],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 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,472,274,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,520,277,[],"_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)
@@ -18000,8 +18713,8 @@
 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","grz",4,0,473,274,[],47,[],"_fullTableColumnValue"],
-VI:[function(a,b,c){var z
+default:}throw H.b(P.hS())},"call$2","gym",4,0,521,277,[],47,[],"_fullTableColumnValue"],
+Wj:[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)
 return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
@@ -18015,39 +18728,31 @@
 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","gaq",4,0,473,274,[],47,[],"_combinedTableColumnValue"],
-RF:[function(a,b){var z,y
-z=a.hm.gZ6().R6()
-if(a.hm.gnI().AQ(z)==null){N.Jx("").To("No isolate found.")
-return}y="/"+z+"/allocationprofile"
-a.hm.gDF().fB(y).ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-ii:[function(a,b,c,d){var z,y
-z=a.hm.gZ6().R6()
-if(a.hm.gnI().AQ(z)==null){N.Jx("").To("No isolate found.")
-return}y="/"+z+"/allocationprofile/reset"
-a.hm.gDF().fB(y).ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,374,18,[],303,[],74,[],"resetAccumulator"],
+default:}throw H.b(P.hS())},"call$2","gPI",4,0,521,277,[],47,[],"_combinedTableColumnValue"],
+RF:[function(a,b){a.pC.oX("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+ii:[function(a,b,c,d){a.pC.oX("/allocationprofile/reset").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,425,18,[],306,[],74,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gBo(a))},"call$1","gaz",2,0,153,227,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gBo(a))},"call$1","gaz",2,0,158,233,[],"profileChanged"],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.p0(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,474,475,[],"formattedAverage",370],
-NC:[function(a,b){var z,y
+return C.CD.yM(J.FW(J.p0(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,522,523,[],"formattedAverage",356],
+uW:[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","gBo",2,0,474,475,[],"formattedCollections",370],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gBo",2,0,522,523,[],"formattedCollections",356],
 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,474,475,[],"formattedTotalCollectionTime",370],
-Dd:[function(a){var z=new L.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,522,523,[],"formattedTotalCollectionTime",356],
+Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
 a.LY.Gl("number","Current (new)")
@@ -18058,15 +18763,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 L.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new L.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
-z=new L.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.bV=z
 z.Gl("string","Class")
 a.bV.Gl("number","Accumulator")
@@ -18074,9 +18779,9 @@
 a.bV.Gl("number","Current")
 a.bV.Gl("number","Allocated Since GC")
 a.bV.Gl("number","Total before GC")
-a.bV.Gl("number","Survivors after GC")},null,null,0,0,108,"created"],
+a.bV.Gl("number","Survivors after GC")},null,null,0,0,113,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-77,bQj<-77,xK<-77,V1g<-77,r1K<-77,d6<-77,pC<-77,DY2<-77",op:[function(a){var z,y,x,w
+static:{"^":"b7<-77,bQj<-77,WY<-77,V1g<-77,r1K<-77,d6<-77,pC<-77,DP<-77",op:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18086,40 +18791,40 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.Vc.ZL(a)
-C.Vc.G6(a)
-C.Vc.Dd(a)
-return a},null,null,0,0,108,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[476],
-pva:{
-"^":"uL+Pi;",
+C.RJ.ZL(a)
+C.RJ.G6(a)
+C.RJ.Dd(a)
+return a},null,null,0,0,113,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[524],
+c4r:{
+"^":"PO+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:355;a-77",
+"^":"Tp:357;a-77",
 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,355,477,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[358],
+"+HeapProfileElement_refresh_closure":[415],
 jm:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,343,18,[],478,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[358],
+"+HeapProfileElement_refresh_closure":[415],
 xj:{
-"^":"Tp:355;a-77",
+"^":"Tp:357;a-77",
 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,355,477,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[358],
+"+HeapProfileElement_resetAccumulator_closure":[415],
 VB:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,343,18,[],478,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[358]}],["html_common","dart:html_common",,P,{
+"+HeapProfileElement_resetAccumulator_closure":[415]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
@@ -18127,7 +18832,7 @@
 new P.wO().call$0()
 return y},"call$1","Lq",2,0,null,23,[]],
 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,147,6,[],235,[]],
+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,152,6,[],241,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18135,7 +18840,7 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:184;b,c",
+"^":"Tp:189;b,c",
 call$1:[function(a){var z,y,x
 z=this.b
 y=z.length
@@ -18145,23 +18850,23 @@
 return y},"call$1",null,2,0,null,23,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:392;d",
+"^":"Tp:372;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,390,[],"call"],
+return z[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:479;e",
+"^":"Tp:525;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,390,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:225;f,UI,bK",
+"^":"Tp:107;f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -18175,7 +18880,7 @@
 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.$isrn)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)
 w=this.UI.call$1(x)
 z.a=w
@@ -18197,11 +18902,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 q1:{
-"^":"Tp:343;a,Gq",
+"^":"Tp:346;a,Gq",
 call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,42,[],23,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:184;a,b",
+"^":"Tp:189;a,b",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -18211,19 +18916,19 @@
 return y},"call$1",null,2,0,null,23,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:392;c",
+"^":"Tp:372;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,390,[],"call"],
+return z[a]},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:479;d",
+"^":"Tp:525;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,390,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:225;e,f,UI,bK",
+"^":"Tp:107;e,f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -18258,18 +18963,18 @@
 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,77,23,[],460,[]],
+return y},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
 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,110,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gnr",0,2,null,330,331,[]],
+aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gnr",0,2,null,333,334,[]],
 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,110,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
 ev:[function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,110,[]],
-Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,110,[]],
+return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
+Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,115,[]],
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
@@ -18282,40 +18987,40 @@
 y=z.Rz(0,b)
 this.p5(z)
 return y},"call$1","gRI",2,0,null,23,[]],
-FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,114,[]],
 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,[]],
+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,336,337,[]],
 eR:[function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,289,[]],
+return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,292,[]],
 Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,47,[]],
 V1:[function(a){this.OS(new P.uQ())},"call$0","gyP",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,110,[]],
+return y},"call$1","gFd",2,0,null,115,[]],
 $isyN:true,
 $iscX:true,
 $ascX:function(){return[J.O]}},
 GE:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 D7:{
 "^":"ar;F1,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,115,[]],
 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,47,[],23,[]],
@@ -18327,13 +19032,13 @@
 this.UZ(0,b,z)},
 h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,23,[]],
 FV:[function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,109,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
 tg:[function(a,b){var z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$iscv)return!1
 return b.parentNode===this.F1},"call$1","gdj",2,0,null,102,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,77,128,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,115,[],116,[],109,[],117,[]],
-UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,115,[],116,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,77,133,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,120,[],121,[]],
 V1:[function(a){this.h2.NL.textContent=""},"call$0","gyP",0,0,null],
 xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,47,[],23,[]],
 KI:[function(a,b){var z,y
@@ -18349,7 +19054,7 @@
 if(y>=z.length)return H.e(z,y)
 x=z[y]
 if(x==null?b==null:x===b){J.QC(x)
-return!0}}return!1},"call$1","gRI",2,0,null,124,[]],
+return!0}}return!1},"call$1","gRI",2,0,null,129,[]],
 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)
@@ -18357,26 +19062,35 @@
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,289,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:225;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,285,[],"call"],
-$isEH:true}}],["instance_ref_element","package:observatory/src/observatory_elements/instance_ref.dart",,B,{
+"^":"Tp:107;",
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,288,[],"call"],
+$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 goc:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.goc.call(this,a)
-return J.UQ(z,"preview")},null,null,1,0,367,"name"],
-Qx:[function(a){return this.gus(a)},"call$0","gyX",0,0,108,"expander"],
-SF:[function(a,b,c){P.JS("Calling expandEvent")
-if(b===!0)a.hm.gDF().fB(this.gO3(a)).ml(new B.Js(a)).OA(new B.fM()).YM(c)
-else{J.kW(a.tY,"fields",null)
+return J.UQ(z,"preview")},null,null,1,0,370,"name"],
+gJp:[function(a){var z=a.tY
+if(z!=null)if(J.de(J.UQ(z,"type"),"@Null"))if(J.de(J.UQ(a.tY,"id"),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.de(J.UQ(a.tY,"id"),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.de(J.UQ(a.tY,"id"),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.de(J.UQ(a.tY,"id"),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.de(J.UQ(a.tY,"id"),"objects/being-initialized"))return"This object is currently being initialized."
+return""},null,null,1,0,370,"hoverText"],
+Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,113,"expander"],
+SF:[function(a,b,c){var z,y
+P.JS("Calling expandEvent")
+if(b===!0){z=a.pC
+y=a.tY
+z.oX(y==null?"":J.UQ(y,"id")).ml(new B.Js(a)).OA(new B.fM()).YM(c)}else{J.kW(a.tY,"fields",null)
 J.kW(a.tY,"elements",null)
-c.call$0()}},"call$2","gus",4,0,480,481,[],356,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,526,527,[],413,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18385,37 +19099,39 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.cp.ZL(a)
 C.cp.G6(a)
-return a},null,null,0,0,108,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[362],
+return a},null,null,0,0,113,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[418],
 Js:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y,x
-P.JS("Result is : "+H.d(a))
-z=this.a
-y=J.RE(z)
-x=J.U6(a)
-J.kW(y.gtY(z),"fields",x.t(a,"fields"))
-J.kW(y.gtY(z),"elements",x.t(a,"elements"))
-J.kW(y.gtY(z),"length",x.t(a,"length"))
-P.JS("ref is "+H.d(y.gtY(z)))},"call$1",null,2,0,225,144,[],"call"],
+z=J.U6(a)
+y=this.a
+if(J.de(z.t(a,"type"),"Null")){z.u(a,"type","@Null")
+x=J.RE(y)
+x.stY(y,x.ct(y,C.kY,x.gtY(y),a))}else{x=J.RE(y)
+J.kW(x.gtY(y),"fields",z.t(a,"fields"))
+J.kW(x.gtY(y),"elements",z.t(a,"elements"))
+J.kW(x.gtY(y),"length",z.t(a,"length"))}x=J.RE(y)
+J.kW(x.gtY(y),"fields",z.t(a,"fields"))
+J.kW(x.gtY(y),"elements",z.t(a,"elements"))
+J.kW(x.gtY(y),"length",z.t(a,"length"))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+InstanceRefElement_expandEvent_closure":[358],
+"+InstanceRefElement_expandEvent_closure":[415],
 fM:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while expanding instance-ref: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while expanding instance-ref: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+InstanceRefElement_expandEvent_closure":[358]}],["instance_view_element","package:observatory/src/observatory_elements/instance_view.dart",,Z,{
+"+InstanceRefElement_expandEvent_closure":[415]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["cda;Xh%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gQr:[function(a){return a.Xh},null,null,1,0,352,"instance",353,354],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,355,23,[],"instance",353],
+"^":["Squ;Xh%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gQr:[function(a){return a.Xh},null,null,1,0,354,"instance",355,397],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,357,23,[],"instance",355],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18428,18 +19144,40 @@
 a.X0=w
 C.yK.ZL(a)
 C.yK.G6(a)
-return a},null,null,0,0,108,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[482],
-cda:{
+return a},null,null,0,0,113,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[528],
+Squ:{
+"^":"PO+Pi;",
+$isd3:true}}],["isolate_element","package:observatory/src/elements/isolate_element.dart",,S,{
+"^":"",
+PO:{
+"^":["Vf;pC%-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gAq:[function(a){return a.pC},null,null,1,0,358,"isolate",355,397],
+sAq:[function(a,b){a.pC=this.ct(a,C.Z8,a.pC,b)},null,null,3,0,359,23,[],"isolate",355],
+"@":function(){return[C.EA]},
+static:{O5:[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.wx.ZL(a)
+C.wx.G6(a)
+return a},null,null,0,0,113,"new IsolateElement$created"]}},
+"+IsolateElement":[529],
+Vf:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_list_element","package:observatory/src/observatory_elements/isolate_list.dart",,L,{
+$isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["uL;hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["Zt;Jh-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 RF:[function(a,b){var z=[]
-J.kH(a.hm.gnI().gi2(),new L.fW(z))
-P.pH(z,!1).ml(new L.Ey(b))},"call$1","gvC",2,0,153,356,[],"refresh"],
-"@":function(){return[C.jFV]},
+J.kH(a.Jh.gi2(),new L.fW(z))
+P.pH(z,!1).ml(new L.Ey(b))},"call$1","gvC",2,0,158,413,[],"refresh"],
+"@":function(){return[C.jF]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18451,21 +19189,21 @@
 a.X0=w
 C.b9.ZL(a)
 C.b9.G6(a)
-return a},null,null,0,0,108,"new IsolateListElement$created"]}},
-"+IsolateListElement":[483],
+return a},null,null,0,0,113,"new IsolateListElement$created"]}},
+"+IsolateListElement":[530],
 fW:{
-"^":"Tp:343;a-77",
-call$2:[function(a,b){J.bi(this.a,J.KM(b))},"call$2",null,4,0,343,238,[],14,[],"call"],
+"^":"Tp:346;a-77",
+call$2:[function(a,b){J.bi(this.a,J.KM(b))},"call$2",null,4,0,346,110,[],14,[],"call"],
 $isEH:true},
-"+IsolateListElement_refresh_closure":[358],
+"+IsolateListElement_refresh_closure":[415],
 Ey:{
-"^":"Tp:225;b-77",
-call$1:[function(a){return this.b.call$0()},"call$1",null,2,0,225,237,[],"call"],
+"^":"Tp:107;b-77",
+call$1:[function(a){return this.b.call$0()},"call$1",null,2,0,107,108,[],"call"],
 $isEH:true},
-"+IsolateListElement_refresh_closure":[358]}],["isolate_profile_element","package:observatory/src/observatory_elements/isolate_profile.dart",,X,{
+"+IsolateListElement_refresh_closure":[415]}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 qm:{
-"^":["Y2;Aq>,tT>-364,eT,yt-484,wd-485,oH-486,np,AP,fn",null,function(){return[C.mI]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+"^":["Y2;Aq>,tT>-420,eT,yt-386,wd-403,oH-404,z3,AP,fn",null,function(){return[C.mI]},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
 H.bQ(this.tT.gVS(),new X.vO(this))},"call$0","gz7",0,0,null],
 o8:[function(){return},"call$0","gDT",0,0,null],
@@ -18479,74 +19217,80 @@
 if(c==null)v.h(z,"")
 else{u=c.tT
 v.h(z,X.eI(u.dJ(y),u.QQ()))}v.h(z,X.eI(y.gfF(),w.gB1(x).ghV()))},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,123,[],236,[]],Tl:function(a,b,c){var z,y
-z=H.VM([],[L.Y2])
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","uV",4,0,null,128,[],242,[]],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}}},
 vO:{
-"^":"Tp:488;a",
+"^":"Tp:532;a",
 call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.Aq,J.on(a),z))},"call$1",null,2,0,null,487,[],"call"],
+J.bi(z.wd,X.Tl(z.Aq,J.on(a),z))},"call$1",null,2,0,null,531,[],"call"],
 $isEH:true},
 E7:{
-"^":["waa;BA%-484,fb=-489,qY%-489,qO=-77,Hm%-490,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gXc:[function(a){return a.BA},null,null,1,0,491,"methodCountSelected",353,370],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,392,23,[],"methodCountSelected",353],
-gDt:[function(a){return a.qY},null,null,1,0,492,"topExclusiveCodes",353,370],
-sDt:[function(a,b){a.qY=this.ct(a,C.jI,a.qY,b)},null,null,3,0,493,23,[],"topExclusiveCodes",353],
-i4:[function(a){var z,y,x,w
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null)return
-x=[]
-w=R.Jk([])
-C.Nm.FV(x,["Method","Exclusive","Caller","Inclusive"])
-a.Hm=new L.XN(x,w,null,null)
+"^":["KUl;SS%-386,fb=-533,qY%-533,qO=-77,Hm%-534,pD%-410,eH%-387,vk%-387,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gXc:[function(a){return a.SS},null,null,1,0,371,"methodCountSelected",355,356],
+sXc:[function(a,b){a.SS=this.ct(a,C.fQ,a.SS,b)},null,null,3,0,372,23,[],"methodCountSelected",355],
+gDt:[function(a){return a.qY},null,null,1,0,535,"topExclusiveCodes",355,356],
+sDt:[function(a,b){a.qY=this.ct(a,C.jI,a.qY,b)},null,null,3,0,536,23,[],"topExclusiveCodes",355],
+gB1:[function(a){return a.pD},null,null,1,0,354,"profile",355,397],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,357,23,[],"profile",355],
+gLW:[function(a){return a.eH},null,null,1,0,370,"sampleCount",355,356],
+sLW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,25,23,[],"sampleCount",355],
+gUo:[function(a){return a.vk},null,null,1,0,370,"refreshTime",355,356],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,25,23,[],"refreshTime",355],
+pM:[function(a,b){var z,y
+if(a.pD==null)return
+P.JS("profile changed")
+z=J.UQ(a.pD,"samples")
+this.IW(a,a.pC,z,a.pD)
+y=a.pC
 this.oC(a,y)
-this.f9(a,y)},"call$0","gQd",0,0,107,"enteredView"],
-yG:[function(a){},"call$0","gCn",0,0,107,"_startRequest"],
-M8:[function(a){},"call$0","gjt",0,0,107,"_endRequest"],
-wW:[function(a,b){var z,y
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null)return
+this.f9(a,y)},"call$1","gaz",2,0,158,233,[],"profileChanged"],
+i4:[function(a){var z,y
+z=[]
+y=R.Jk([])
+C.Nm.FV(z,["Method","Exclusive","Caller","Inclusive"])
+a.Hm=new G.XN(z,y,null,null)
+y=a.pC
 this.oC(a,y)
-this.f9(a,y)},"call$1","ghj",2,0,225,227,[],"methodCountSelectedChanged"],
-RF:[function(a,b){var z,y,x
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null){N.Jx("").To("No isolate found.")
-return}x="/"+z+"/profile"
-a.hm.gDF().fB(x).ml(new X.SV(a,y)).OA(new X.vH(a)).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-IW:[function(a,b,c,d){J.CJ(b,L.hh(b,d))
+this.f9(a,y)},"call$0","gQd",0,0,112,"enteredView"],
+wW:[function(a,b){var z=a.pC
+this.oC(a,z)
+this.f9(a,z)},"call$1","ghj",2,0,107,233,[],"methodCountSelectedChanged"],
+RF:[function(a,b){a.pC.oX("profile").ml(new X.SV(a)).OA(new X.Mf()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+IW:[function(a,b,c,d){var z=J.AG(c)
+a.eH=this.ct(a,C.XU,a.eH,z)
+z=P.Gi().bu(0)
+a.vk=this.ct(a,C.Dj,a.vk,z)
+J.CJ(b,G.hh(b,d))
 this.oC(a,b)
-this.f9(a,b)},"call$3","gja",6,0,494,14,[],495,[],477,[],"_loadProfileData"],
+this.f9(a,b)},"call$3","gja",6,0,537,14,[],538,[],379,[],"_loadProfileData"],
 yF:[function(a,b){this.oC(a,b)
-this.f9(a,b)},"call$1","gAL",2,0,496,14,[],"_refresh"],
+this.f9(a,b)},"call$1","gAL",2,0,539,14,[],"_refresh"],
 f9:[function(a,b){var z,y
 z=[]
 for(y=J.GP(a.qY);y.G();)z.push(X.Tl(b,y.gl(),null))
 a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$1","gCK",2,0,496,14,[],"_refreshTree"],
+this.ct(a,C.ep,null,a.Hm)},"call$1","gCK",2,0,539,14,[],"_refreshTree"],
 oC:[function(a,b){var z,y
 J.U2(a.qY)
 if(b==null||J.Tv(b)==null)return
-z=J.UQ(a.fb,a.BA)
+z=J.UQ(a.fb,a.SS)
 y=J.Tv(b).T0(z)
-J.bj(a.qY,y)},"call$1","guE",2,0,496,14,[],"_refreshTopMethods"],
-ka:[function(a,b){return"padding-left: "+H.d(J.p0(b.gyt(),16))+"px;"},"call$1","gGX",2,0,497,498,[],"padding",370],
-LZ:[function(a,b){var z=J.bY(b.gyt(),5)
+J.bj(a.qY,y)},"call$1","guE",2,0,539,14,[],"_refreshTopMethods"],
+ka:[function(a,b){return"padding-left: "+H.d(J.p0(b.gyt(),16))+"px;"},"call$1","gGX",2,0,540,363,[],"padding",356],
+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,497,498,[],"coloring",370],
+return C.PQ[z]},"call$1","gth",2,0,540,363,[],"coloring",356],
 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
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,499,18,[],303,[],74,[],"toggleExpanded",370],
+y.Mf(x-1)}},"call$3","gpR",6,0,541,18,[],306,[],74,[],"toggleExpanded",356],
 "@":function(){return[C.jR]},
 static:{jD:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -18555,43 +19299,40 @@
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.BA=0
+a.SS=0
 a.fb=[10,20,50]
 a.qY=z
 a.qO="#tableTree"
+a.eH=""
+a.vk=""
 a.SO=y
 a.B7=x
 a.X0=v
 C.XH.ZL(a)
 C.XH.G6(a)
-return a},null,null,0,0,108,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[500],
-waa:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[542],
+KUl:{
+"^":"PO+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:355;a-77,b-77",
-call$1:[function(a){var z,y,x,w
+"^":"Tp:357;a-77",
+call$1:[function(a){var z,y,x
 z=J.UQ(a,"samples")
 N.Jx("").To("Profile contains "+H.d(z)+" samples.")
 y=this.a
-x=this.b
-J.CJ(x,L.hh(x,a))
-w=J.RE(y)
-w.oC(y,x)
-w.f9(y,x)},"call$1",null,2,0,355,501,[],"call"],
+x=J.RE(y)
+x.IW(y,x.gpC(y),z,a)},"call$1",null,2,0,357,543,[],"call"],
 $isEH:true},
-"+IsolateProfileElement_refresh_closure":[358],
-vH:{
-"^":"Tp:225;c-77",
-call$1:[function(a){},"call$1",null,2,0,225,18,[],"call"],
+"+IsolateProfileElement_refresh_closure":[415],
+Mf:{
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").wF("Error refreshing profile",a,b)},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+IsolateProfileElement_refresh_closure":[358]}],["isolate_summary_element","package:observatory/src/observatory_elements/isolate_summary.dart",,D,{
+"+IsolateProfileElement_refresh_closure":[415]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
-St:{
-"^":["V0;Pw%-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gAq:[function(a){return a.Pw},null,null,1,0,502,"isolate",353,354],
-sAq:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,503,23,[],"isolate",353],
+Kz:{
+"^":["PO;pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18604,39 +19345,36 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.G6(a)
-return a},null,null,0,0,108,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[504],
-V0:{
-"^":"uL+Pi;",
-$isd3:true}}],["json_view_element","package:observatory/src/observatory_elements/json_view.dart",,Z,{
+return a},null,null,0,0,113,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[544]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["V4;eb%-77,kf%-77,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gvL:[function(a){return a.eb},null,null,1,0,108,"json",353,354],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,225,23,[],"json",353],
+"^":["tuj;eb%-77,kf%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gvL:[function(a){return a.eb},null,null,1,0,113,"json",355,397],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,107,23,[],"json",355],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.kf=0},"call$0","gQd",0,0,107,"enteredView"],
-yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,153,227,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,367,"primitiveString"],
+a.kf=0},"call$0","gQd",0,0,112,"enteredView"],
+yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,158,233,[],"jsonChanged"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,370,"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,367,"valueType"],
+return"Primitive"},null,null,1,0,370,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,491,"counter"],
+return z},null,null,1,0,371,"counter"],
 gaK:[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,492,"list"],
+return[]},null,null,1,0,535,"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,492,"keys"],
+return[]},null,null,1,0,535,"keys"],
 r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,25,42,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
@@ -18652,14 +19390,14 @@
 a.X0=w
 C.GB.ZL(a)
 C.GB.G6(a)
-return a},null,null,0,0,108,"new JsonViewElement$created"]}},
-"+JsonViewElement":[505],
-V4:{
+return a},null,null,0,0,113,"new JsonViewElement$created"]}},
+"+JsonViewElement":[545],
+tuj:{
 "^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/observatory_elements/library_ref.dart",,R,{
+$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.QU]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18668,21 +19406,19 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.G6(a)
-return a},null,null,0,0,108,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[362]}],["library_view_element","package:observatory/src/observatory_elements/library_view.dart",,M,{
+return a},null,null,0,0,113,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[418]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 T2:{
-"^":["V10;N7%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.N7},null,null,1,0,352,"library",353,354],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,355,23,[],"library",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP(J.UQ(a.N7,"id"))
-a.hm.gDF().fB(z).ml(new M.Jq(a)).OA(new M.RJ()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
+"^":["mHk;N7%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtD:[function(a){return a.N7},null,null,1,0,354,"library",355,397],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,357,23,[],"library",355],
+RF:[function(a,b){a.pC.oX(J.UQ(a.N7,"id")).ml(new M.Jq(a)).OA(new M.Yn()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
 "@":function(){return[C.Gg]},
 static:{SP:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
@@ -18698,24 +19434,24 @@
 a.X0=v
 C.MG.ZL(a)
 C.MG.G6(a)
-return a},null,null,0,0,108,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[506],
-V10:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[546],
+mHk:{
+"^":"PO+Pi;",
 $isd3:true},
 Jq:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sN7(z,y.ct(z,C.EV,y.gN7(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sN7(z,y.ct(z,C.EV,y.gN7(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+LibraryViewElement_refresh_closure":[358],
-RJ:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing library-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"+LibraryViewElement_refresh_closure":[415],
+Yn:{
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while refreshing library-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+LibraryViewElement_refresh_closure":[358]}],["logging","package:logging/logging.dart",,N,{
+"+LibraryViewElement_refresh_closure":[415]}],["logging","package:logging/logging.dart",,N,{
 "^":"",
 TJ:{
 "^":"a;oc>,eT>,n2,Cj>,wd>,Gs",
@@ -18735,19 +19471,18 @@
 Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,23,[]],
 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)
-y.EK()
+y=P.Gi()
 x=$.xO
 $.xO=x+1
 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,77,77,507,[],20,[],155,[],156,[]],
-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,77,77,20,[],155,[],156,[]],
-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,"gjW",2,4,null,77,77,20,[],155,[],156,[]],
-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,77,77,20,[],155,[],156,[]],
-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,77,77,20,[],155,[],156,[]],
-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,"gxx",2,4,null,77,77,20,[],155,[],156,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,77,77,547,[],20,[],160,[],161,[]],
+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,"gEX",2,4,null,77,77,20,[],160,[],161,[]],
+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,77,77,20,[],160,[],161,[]],
+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,77,77,20,[],160,[],161,[]],
+wF:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.wF(a,null,null)},"j2","call$3",null,"goa",2,4,null,77,77,20,[],160,[],161,[]],
+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,"gxx",2,4,null,77,77,20,[],160,[],161,[]],
 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
@@ -18760,7 +19495,7 @@
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(new P.AT("name shouldn't start with a '.'"))
@@ -18810,30 +19545,29 @@
 var z=H.VM(new P.Zf(P.Dt(null)),[null])
 N.Jx("").To("Loading Google Charts API")
 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(L.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
+z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:509;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,508,[],"call"],
+"^":"Tp:549;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,548,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"call$1",null,2,0,null,237,[],"call"],
-$isEH:true}}],["message_viewer_element","package:observatory/src/observatory_elements/message_viewer.dart",,L,{
+A.Ok()},"call$1",null,2,0,null,108,[],"call"],
+$isEH:true}}],["message_viewer_element","package:observatory/src/elements/message_viewer.dart",,L,{
 "^":"",
 PF:{
-"^":["uL;Gj%-349,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gG1:[function(a){return a.Gj},null,null,1,0,352,"message",354],
-sG1:[function(a,b){a.Gj=b
-this.ct(a,C.US,"",this.gQW(a))
-this.ct(a,C.zu,[],this.glc(a))
-N.Jx("").To("Viewing message of type '"+H.d(J.UQ(a.Gj,"type"))+"'")},null,null,3,0,355,186,[],"message",354],
+"^":["Vct;Gj%-410,ah%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gG1:[function(a){return a.Gj},null,null,1,0,354,"message",397],
+guw:[function(a){return a.ah},null,null,1,0,408,"app",355,397],
+suw:[function(a,b){a.ah=this.ct(a,C.wh,a.ah,b)},null,null,3,0,551,23,[],"app",355],
+sG1:[function(a,b){if(b==null){N.Jx("").To("Viewing null message.")
+return}N.Jx("").To("Viewing message of type '"+H.d(J.UQ(b,"type"))+"'")
+a.Gj=b
+this.ct(a,C.US,"",this.gQW(a))},null,null,3,0,357,191,[],"message",397],
 gQW:[function(a){var z=a.Gj
 if(z==null||J.UQ(z,"type")==null)return"Error"
-return J.UQ(a.Gj,"type")},null,null,1,0,367,"messageType"],
-glc:[function(a){var z=a.Gj
-if(z==null||J.UQ(z,"members")==null)return[]
-return J.UQ(a.Gj,"members")},null,null,1,0,510,"members"],
+return J.UQ(a.Gj,"type")},null,null,1,0,370,"messageType"],
 "@":function(){return[C.rc]},
 static:{A5:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18846,23 +19580,26 @@
 a.X0=w
 C.Wp.ZL(a)
 C.Wp.G6(a)
-return a},null,null,0,0,108,"new MessageViewerElement$created"]}},
-"+MessageViewerElement":[483]}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
+return a},null,null,0,0,113,"new MessageViewerElement$created"]}},
+"+MessageViewerElement":[552],
+Vct:{
+"^":"uL+Pi;",
+$isd3:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-T4:{
-"^":"a;T9,Jt",
+fA:{
+"^":"a;T9,Bu",
 static:{"^":"Xd,en,pjg,PZ,xa"}},
 Qz:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-PO:{
+Jo:{
 "^":"a;"},
 c5:{
-"^":"a;"}}],["nav_bar_element","package:observatory/src/observatory_elements/nav_bar.dart",,A,{
+"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.nW]},
 static:{z5:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18875,16 +19612,16 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.G6(a)
-return a},null,null,0,0,108,"new NavBarElement$created"]}},
-"+NavBarElement":[483],
+return a},null,null,0,0,113,"new NavBarElement$created"]}},
+"+NavBarElement":[553],
 aQ:{
-"^":["V11;KU%-369,ZC%-369,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.KU},null,null,1,0,367,"link",353,354],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,25,23,[],"link",353],
-gdU:[function(a){return a.ZC},null,null,1,0,367,"anchor",353,354],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["D13;uy%-387,ZC%-387,Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
+sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
+gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
+sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.pc]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18892,7 +19629,7 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
+a.uy="#"
 a.ZC="---"
 a.Jo=!1
 a.SO=z
@@ -18900,17 +19637,17 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.G6(a)
-return a},null,null,0,0,108,"new NavMenuElement$created"]}},
-"+NavMenuElement":[511],
-V11:{
+return a},null,null,0,0,113,"new NavMenuElement$created"]}},
+"+NavMenuElement":[554],
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
-Qa:{
-"^":["V12;KU%-369,ZC%-369,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.KU},null,null,1,0,367,"link",353,354],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,25,23,[],"link",353],
-gdU:[function(a){return a.ZC},null,null,1,0,367,"anchor",353,354],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",353],
+Ya5:{
+"^":["WZq;uy%-387,ZC%-387,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
+sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
+gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
+sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
 "@":function(){return[C.qT]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18918,31 +19655,31 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
+a.uy="#"
 a.ZC="---"
 a.SO=z
 a.B7=y
 a.X0=w
 C.nn.ZL(a)
 C.nn.G6(a)
-return a},null,null,0,0,108,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[512],
-V12:{
+return a},null,null,0,0,113,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[555],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true},
-vI:{
-"^":["V13;rU%-77,SB%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gFR:[function(a){return a.rU},null,null,1,0,108,"callback",353,354],
+Ww:{
+"^":["pva;rU%-77,SB%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gFR:[function(a){return a.rU},null,null,1,0,113,"callback",355,397],
 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,225,23,[],"callback",353],
-gxw:[function(a){return a.SB},null,null,1,0,371,"active",353,354],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,372,23,[],"active",353],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,107,23,[],"callback",355],
+gxw:[function(a){return a.SB},null,null,1,0,380,"active",355,397],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,381,23,[],"active",355],
 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","gzY",6,0,374,18,[],303,[],74,[],"buttonClick"],
-wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,107,"refreshDone"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gzY",6,0,425,18,[],306,[],74,[],"buttonClick"],
+wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,112,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{ZC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18956,15 +19693,15 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.G6(a)
-return a},null,null,0,0,108,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[513],
-V13:{
+return a},null,null,0,0,113,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[556],
+pva:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V14;Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["cda;Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18978,17 +19715,15 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.G6(a)
-return a},null,null,0,0,108,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[514],
-V14:{
+return a},null,null,0,0,113,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[557],
+cda:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["V15;iy%-361,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gAq:[function(a){return a.iy},null,null,1,0,502,"isolate",353,354],
-sAq:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,503,23,[],"isolate",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["qFb;Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.zaS]},
 static:{Yt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19002,17 +19737,17 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.G6(a)
-return a},null,null,0,0,108,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[515],
-V15:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[558],
+qFb:{
+"^":"PO+Pi;",
 $isd3:true},
-Zt:{
-"^":["V16;Ap%-349,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.Ap},null,null,1,0,352,"library",353,354],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,355,23,[],"library",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+oM:{
+"^":["rna;Ap%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtD:[function(a){return a.Ap},null,null,1,0,354,"library",355,397],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,357,23,[],"library",355],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19026,17 +19761,17 @@
 a.X0=w
 C.S3.ZL(a)
 C.S3.G6(a)
-return a},null,null,0,0,108,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[516],
-V16:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[559],
+rna:{
+"^":"PO+Pi;",
 $isd3:true},
 wM:{
-"^":["V17;Au%-349,Jo%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.Au},null,null,1,0,352,"cls",353,354],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,355,23,[],"cls",353],
-grZ:[function(a){return a.Jo},null,null,1,0,371,"last",353,354],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,372,23,[],"last",353],
+"^":["Vba;Au%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRu:[function(a){return a.Au},null,null,1,0,354,"cls",355,397],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,357,23,[],"cls",355],
+grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19050,742 +19785,29 @@
 a.X0=w
 C.xE.ZL(a)
 C.xE.G6(a)
-return a},null,null,0,0,108,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[517],
-V17:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory","package:observatory/observatory.dart",,L,{
-"^":"",
-m7:[function(a){var z
-N.Jx("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.cM(),"google"),"visualization")
-$.NR=z
-return z},"call$1","vN",2,0,225,237,[]],
-CX:[function(a){var z,y,x,w,v,u
-z=$.mE().R4(0,a)
-if(z==null)return 0
-try{x=z.gQK().input
-w=z
-v=w.gQK().index
-w=w.gQK()
-if(0>=w.length)return H.e(w,0)
-w=J.q8(w[0])
-if(typeof w!=="number")return H.s(w)
-y=H.BU(C.xB.yn(x,v+w),16,null)
-return y}catch(u){H.Ru(u)
-return 0}},"call$1","Cz",2,0,null,214,[]],
-r5:[function(a){var z,y,x,w,v
-z=$.kj().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-v=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.Nj(x,w,v+y)},"call$1","cK",2,0,null,214,[]],
-Lw:[function(a){var z=L.r5(a)
-if(z==null)return
-return J.ZZ(z,1)},"call$1","J4",2,0,null,214,[]],
-CB:[function(a){var z,y,x,w
-z=$.XJ().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},"call$1","jU",2,0,null,214,[]],
-mL:{
-"^":["Pi;Z6<-518,DF<-519,nI<-520,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
-pO:[function(){var z,y,x
-z=this.Z6
-z.sXT(this)
-y=this.DF
-y.sXT(this)
-x=this.nI
-x.sXT(this)
-$.tE=this
-y.se0(x.gPI())
-z.kI()},"call$0","gGo",0,0,null],
-AQ:[function(a){return J.UQ(this.nI.gi2(),a)},"call$1","grE",2,0,null,238,[]],
-US:function(){this.pO()},
-hq:function(){this.pO()},
-static:{"^":"li,pQ"}},
-Kf:{
-"^":"a;oV<",
-goH:function(){return this.oV.nQ("getNumberOfColumns")},
-gWT:function(a){return this.oV.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.oV.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],521,[]],
-lb:[function(){var z=this.oV
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gGL",0,0,null],
-RP:[function(a,b){var z=[]
-C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.oV.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,498,[]]},
-qu:{
-"^":"a;YZ,bG>",
-u5:[function(){var z,y,x
-z=this.YZ.nQ("getSortInfo")
-if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
-x=J.U6(z)
-y.u(0,"sortColumn",x.t(z,"column"))
-y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gIK",0,0,null],
-W2:[function(a){var z=P.jT(this.bG)
-this.YZ.V7("draw",[a.goV(),z])},"call$1","gW8",2,0,null,181,[]]},
-bv:{
-"^":["Pi;WP,XR<-522,Z0<-523,md,mY,e8,F3,Gg,LE<-524,iP,mU,mM,Td,AP,fn",null,function(){return[C.mI]},function(){return[C.mI]},null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gB1:[function(a){return this.WP},null,null,1,0,525,"profile",353,370],
-sB1:[function(a,b){this.WP=F.Wi(this,C.vb,this.WP,b)},null,null,3,0,526,23,[],"profile",353],
-gjO:[function(a){return this.md},null,null,1,0,367,"id",353,370],
-sjO:[function(a,b){this.md=F.Wi(this,C.EN,this.md,b)},null,null,3,0,25,23,[],"id",353],
-goc:[function(a){return this.mY},null,null,1,0,367,"name",353,370],
-soc:[function(a,b){this.mY=F.Wi(this,C.YS,this.mY,b)},null,null,3,0,25,23,[],"name",353],
-gzz:[function(){return this.e8},null,null,1,0,367,"vmName",353,370],
-szz:[function(a){this.e8=F.Wi(this,C.KS,this.e8,a)},null,null,3,0,25,23,[],"vmName",353],
-gw2:[function(){return this.F3},null,null,1,0,352,"entry",353,370],
-sw2:[function(a){this.F3=F.Wi(this,C.tP,this.F3,a)},null,null,3,0,355,23,[],"entry",353],
-gVc:[function(){return this.Gg},null,null,1,0,367,"rootLib",353,370],
-sVc:[function(a){this.Gg=F.Wi(this,C.iF,this.Gg,a)},null,null,3,0,25,23,[],"rootLib",353],
-gCi:[function(){return this.iP},null,null,1,0,491,"newHeapUsed",353,370],
-sCi:[function(a){this.iP=F.Wi(this,C.IO,this.iP,a)},null,null,3,0,392,23,[],"newHeapUsed",353],
-guq:[function(){return this.mU},null,null,1,0,491,"oldHeapUsed",353,370],
-suq:[function(a){this.mU=F.Wi(this,C.ap,this.mU,a)},null,null,3,0,392,23,[],"oldHeapUsed",353],
-gKu:[function(){return this.mM},null,null,1,0,352,"topFrame",353,370],
-sKu:[function(a){this.mM=F.Wi(this,C.ch,this.mM,a)},null,null,3,0,355,23,[],"topFrame",353],
-gNh:[function(a){return this.Td},null,null,1,0,367,"fileAndLine",353,370],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.Td=F.Wi(this,C.SK,this.Td,b)},null,null,3,0,25,23,[],"fileAndLine",353],
-zr:[function(a){var z="/"+H.d(this.md)+"/"
-return $.tE.DF.fB(z).ml(new L.eS(this)).OA(new L.IQ())},"call$0","gvC",0,0,null],
-eC:[function(a){var z,y,x,w
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"Isolate")){N.Jx("").hh("Unexpected message type in Isolate.update: "+H.d(z.t(a,"type")))
-return}if(z.t(a,"rootLib")==null||z.t(a,"timers")==null||z.t(a,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(a))
-return}y=J.UQ(z.t(a,"rootLib"),"id")
-this.Gg=F.Wi(this,C.iF,this.Gg,y)
-y=z.t(a,"name")
-this.e8=F.Wi(this,C.KS,this.e8,y)
-if(z.t(a,"entry")!=null){y=z.t(a,"entry")
-y=F.Wi(this,C.tP,this.F3,y)
-this.F3=y
-y=J.UQ(y,"name")
-this.mY=F.Wi(this,C.YS,this.mY,y)}else this.mY=F.Wi(this,C.YS,this.mY,"root isolate")
-if(z.t(a,"topFrame")!=null){y=z.t(a,"topFrame")
-this.mM=F.Wi(this,C.ch,this.mM,y)}x=H.B7([],P.L5(null,null,null,null,null))
-J.kH(z.t(a,"timers"),new L.TI(x))
-y=this.LE
-w=J.w1(y)
-w.u(y,"total",x.t(0,"time_total_runtime"))
-w.u(y,"compile",x.t(0,"time_compilation"))
-w.u(y,"gc",0)
-w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
-w.u(y,"dart",x.t(0,"time_dart_execution"))
-y=J.UQ(z.t(a,"heap"),"usedNew")
-this.iP=F.Wi(this,C.IO,this.iP,y)
-z=J.UQ(z.t(a,"heap"),"usedOld")
-this.mU=F.Wi(this,C.ap,this.mU,z)},"call$1","gpn",2,0,null,144,[]],
-bu:[function(a){return H.d(this.md)},"call$0","gXo",0,0,null],
-hv:[function(a){var z,y,x,w
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-if(J.kE(y.t(z,x),a)===!0)return y.t(z,x);++x}return},"call$1","gt7",2,0,null,527,[]],
-R7:[function(){var z,y,x,w
-N.Jx("").To("Reset all code ticks.")
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-y.t(z,x).FB();++x}},"call$0","gve",0,0,null],
-oe:[function(a){var z,y,x,w,v,u,t
-for(z=J.GP(a),y=this.XR,x=J.U6(y);z.G();){w=z.gl()
-v=J.U6(w)
-u=J.UQ(v.t(w,"script"),"id")
-t=x.t(y,u)
-if(t==null){t=L.Ak(v.t(w,"script"))
-x.u(y,u,t)}t.o6(v.t(w,"hits"))}},"call$1","gHY",2,0,null,528,[]],
-$isbv:true,
-static:{"^":"tE?"}},
-eS:{
-"^":"Tp:225;a",
-call$1:[function(a){this.a.eC(a)},"call$1",null,2,0,null,144,[],"call"],
-$isEH:true},
-IQ:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while updating isolate summary: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,null,18,[],359,[],"call"],
-$isEH:true},
-TI:{
-"^":"Tp:225;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,529,[],"call"],
-$isEH:true},
-yU:{
-"^":["Pi;XT?,i2<-530,AP,fn",null,function(){return[C.mI]},null,null],
-Ql:[function(){J.kH(this.XT.DF.gjR(),new L.dY(this))},"call$0","gPI",0,0,107],
-AQ:[function(a){var z,y,x,w,v,u
-z=this.i2
-y=J.U6(z)
-x=y.t(z,a)
-if(x==null){w=P.L5(null,null,null,J.O,L.rj)
-w=R.Jk(w)
-v=H.VM([],[L.kx])
-u=P.L5(null,null,null,J.O,J.GW)
-u=R.Jk(u)
-x=new L.bv(null,w,v,a,"isolate",null,null,null,u,0,0,null,null,null,null)
-y.u(z,a,x)}if(x.gzz()==null)J.KM(x)
-return x},"call$1","grE",2,0,null,238,[]],
-N8:[function(a){var z=[]
-J.kH(this.i2,new L.vY(a,z))
-H.bQ(z,new L.zZ(this))
-J.kH(a,new L.dS(this))},"call$1","gajF",2,0,null,239,[]],
-static:{AC:[function(a,b){return J.pb(b,new L.Ub(a))},"call$2","mc",4,0,null,238,[],239,[]]}},
-Ub:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,531,[],"call"],
-$isEH:true},
-dY:{
-"^":"Tp:225;a",
-call$1:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"IsolateList"))this.a.N8(z.t(a,"members"))},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-vY:{
-"^":"Tp:343;a,b",
-call$2:[function(a,b){if(L.AC(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,427,[],274,[],"call"],
-$isEH:true},
-zZ:{
-"^":"Tp:225;c",
-call$1:[function(a){J.V1(this.c.i2,a)},"call$1",null,2,0,null,238,[],"call"],
-$isEH:true},
-dS:{
-"^":"Tp:225;d",
-call$1:[function(a){var z,y,x,w,v,u,t,s
-z=J.U6(a)
-y=z.t(a,"id")
-x=this.d.i2
-w=J.U6(x)
-v=w.t(x,y)
-if(v==null){u=P.L5(null,null,null,J.O,L.rj)
-u=R.Jk(u)
-t=H.VM([],[L.kx])
-s=P.L5(null,null,null,J.O,J.GW)
-s=R.Jk(s)
-v=new L.bv(null,u,t,z.t(a,"id"),z.t(a,"name"),null,null,null,s,0,0,null,null,null,null)
-w.u(x,y,v)}J.KM(v)},"call$1",null,2,0,null,144,[],"call"],
-$isEH:true},
-dZ:{
-"^":"Pi;XT?,WP,kg,UL,AP,fn",
-gB1:[function(a){return this.WP},null,null,1,0,371,"profile",353,370],
-sB1:[function(a,b){this.WP=F.Wi(this,C.vb,this.WP,b)},null,null,3,0,372,23,[],"profile",353],
-gb8:[function(){return this.kg},null,null,1,0,367,"currentHash",353,370],
-sb8:[function(a){this.kg=F.Wi(this,C.h1,this.kg,a)},null,null,3,0,25,23,[],"currentHash",353],
-gXX:[function(){return this.UL},null,null,1,0,532,"currentHashUri",353,370],
-sXX:[function(a){this.UL=F.Wi(this,C.tv,this.UL,a)},null,null,3,0,533,23,[],"currentHashUri",353],
-kI:[function(){var z=C.PP.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new L.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
-if(!this.S7())this.df()},"call$0","gMz",0,0,null],
-vI:[function(){var z,y,x,w,v
-z=$.oy().R4(0,this.kg)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-v=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.Nj(x,w,v+y)},"call$0","gzJ",0,0,null],
-gwB:[function(){return this.vI()!=null},null,null,1,0,371,"hasCurrentIsolate",370],
-R6:[function(){var z=this.vI()
-if(z==null)return""
-return J.ZZ(z,2)},"call$0","gKo",0,0,null],
-Pr:[function(){var z=this.R6()
-if(z==="")return
-return this.XT.nI.AQ(z)},"call$0","gjf",0,0,502,"currentIsolate",370],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
-z=F.Wi(this,C.h1,this.kg,z)
-this.kg=z
-if(J.de(z,"")||J.de(this.kg,"#")){J.We(C.ol.gmW(window),"#/isolates/")
-return!0}return!1},"call$0","goO",0,0,null],
-df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
-z=F.Wi(this,C.h1,this.kg,z)
-this.kg=z
-y=J.ZZ(z,1)
-z=P.r6($.qG().ej(y))
-this.UL=F.Wi(this,C.tv,this.UL,z)
-z=$.wf()
-x=this.kg
-z=z.Ej
-if(typeof x!=="string")H.vh(new P.AT(x))
-if(z.test(x))this.WP=F.Wi(this,C.vb,this.WP,!0)
-else{this.XT.DF.ox(y)
-this.WP=F.Wi(this,C.vb,this.WP,!1)}},"call$0","glq",0,0,null],
-kP:[function(a){var z=this.R6()
-return"#/"+z+"/"+H.d(a)},"call$1","gVM",2,0,534,276,[],"currentIsolateRelativeLink",370],
-XY:[function(a){return this.kP("scripts/"+P.jW(C.yD,a,C.xM,!1))},"call$1","gOs",2,0,534,535,[],"currentIsolateScriptLink",370],
-r4:[function(a,b,c){return"#/"+H.d(b)+"/"+H.d(c)},"call$2","gLc",4,0,536,537,[],276,[],"relativeLink",370],
-da:[function(a){return"#/"+H.d(a)},"call$1","geP",2,0,534,276,[],"absoluteLink",370],
-static:{"^":"x4,K3D,qY,HT"}},
-Qe:{
-"^":"Tp:225;a",
-call$1:[function(a){var z=this.a
-if(z.S7())return
-F.Wi(z,C.D2,z.vI()==null,z.vI()!=null)
-z.df()},"call$1",null,2,0,null,410,[],"call"],
-$isEH:true},
-DP:{
-"^":["Pi;Yu<-484,m7<-369,L4<-369,Fv,ZZ,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-ga0:[function(){return this.Fv},null,null,1,0,491,"ticks",353,370],
-sa0:[function(a){this.Fv=F.Wi(this,C.p1,this.Fv,a)},null,null,3,0,392,23,[],"ticks",353],
-gGK:[function(){return this.ZZ},null,null,1,0,538,"percent",353,370],
-sGK:[function(a){this.ZZ=F.Wi(this,C.tI,this.ZZ,a)},null,null,3,0,539,23,[],"percent",353],
-oS:[function(){var z=this.ZZ
-if(z==null||J.Hb(z,0))return""
-return J.Ez(this.ZZ,2)+"% ("+H.d(this.Fv)+")"},"call$0","gu3",0,0,367,"formattedTicks",370],
-xt:[function(){return"0x"+J.u1(this.Yu,16)},"call$0","gZd",0,0,367,"formattedAddress",370]},
-WAE:{
-"^":"a;eg",
-bu:[function(a){return"CodeKind."+this.eg},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg",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
-throw H.b(P.hS())},"call$1","J6",2,0,null,86,[]]}},
-N8:{
-"^":"a;Yu<,z4,Iw"},
-Vi:{
-"^":"a;tT>,Ou<"},
-kx:{
-"^":["Pi;fY>,vg,Mb,a0<,VS<,hw,fF<,Du<,va<-540,Qo,uP,mY,B0,AP,fn",null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gkx:[function(){return this.Qo},null,null,1,0,352,"functionRef",353,370],
-skx:[function(a){this.Qo=F.Wi(this,C.yg,this.Qo,a)},null,null,3,0,355,23,[],"functionRef",353],
-gZN:[function(){return this.uP},null,null,1,0,352,"codeRef",353,370],
-sZN:[function(a){this.uP=F.Wi(this,C.EX,this.uP,a)},null,null,3,0,355,23,[],"codeRef",353],
-goc:[function(a){return this.mY},null,null,1,0,367,"name",353,370],
-soc:[function(a,b){this.mY=F.Wi(this,C.YS,this.mY,b)},null,null,3,0,25,23,[],"name",353],
-giK:[function(){return this.B0},null,null,1,0,367,"userName",353,370],
-siK:[function(a){this.B0=F.Wi(this,C.ct,this.B0,a)},null,null,3,0,25,23,[],"userName",353],
-Ne:[function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-this.fF=H.BU(z.t(b,"inclusive_ticks"),null,null)
-this.Du=H.BU(z.t(b,"exclusive_ticks"),null,null)
-y=z.t(b,"ticks")
-if(y!=null&&J.z8(J.q8(y),0)){z=J.U6(y)
-x=this.a0
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=H.BU(z.t(y,w),16,null)
-t=H.BU(z.t(y,w+1),null,null)
-x.push(new L.N8(u,H.BU(z.t(y,w+2),null,null),t))
-w+=3}}},"call$1","gK0",2,0,null,144,[]],
-QQ:[function(){return this.fs(this.VS)},"call$0","gyj",0,0,null],
-dJ:[function(a){return this.U8(this.VS,a)},"call$1","gf7",2,0,null,136,[]],
-fs:[function(a){var z,y,x
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]),y=0;z.G();){x=z.lo.gOu()
-if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gJ6",2,0,null,541,[]],
-U8:[function(a,b){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(J.de(J.on(y),b))return y.gOu()}return 0},"call$2","gPz",4,0,null,541,[],136,[]],
-hI:[function(a,b){var z=J.U6(a)
-this.OV(this.VS,z.t(a,"callers"),b)
-this.OV(this.hw,z.t(a,"callees"),b)},"call$2","gL0",4,0,null,136,[],542,[]],
-OV:[function(a,b,c){var z,y,x,w,v
-C.Nm.sB(a,0)
-z=J.U6(b)
-y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
-if(w>>>0!==w||w>=c.length)return H.e(c,w)
-a.push(new L.Vi(c[w],v))
-y+=2}H.ZE(a,0,a.length-1,new L.fx())},"call$3","gI1",6,0,null,541,[],233,[],542,[]],
-FB:[function(){this.fF=0
-this.Du=0
-C.Nm.sB(this.a0,0)
-for(var z=J.GP(this.va);z.G();)z.gl().sa0(0)},"call$0","gNB",0,0,null],
-fo:[function(a){var z,y,x,w,v
-z=this.va
-y=J.w1(z)
-y.V1(z)
-x=J.U6(a)
-w=0
-while(!0){v=x.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(J.de(x.t(a,w),""))break c$0
-y.h(z,new L.DP(H.BU(x.t(a,w),null,null),x.t(a,w+1),x.t(a,w+2),0,null,null,null))}w+=3}},"call$1","gwj",2,0,null,543,[]],
-tg:[function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.Mb)},"call$1","gdj",2,0,null,527,[]],
-NV:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"function")
-y=R.Jk(y)
-this.Qo=F.Wi(this,C.yg,this.Qo,y)
-y=R.Jk(a)
-this.uP=F.Wi(this,C.EX,this.uP,y)
-y=z.t(a,"name")
-this.mY=F.Wi(this,C.YS,this.mY,y)
-y=z.t(a,"user_name")
-this.B0=F.Wi(this,C.ct,this.B0,y)
-if(z.t(a,"disassembly")!=null)this.fo(z.t(a,"disassembly"))},
-$iskx:true},
-fx:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.xH(b.gOu(),a.gOu())},"call$2",null,4,0,null,123,[],183,[],"call"],
-$isEH:true},
-CM:{
-"^":"a;Aq>,jV,hV<",
-U5:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"ProfileCode"))return
-y=this.Aq
-x=y.hv(H.BU(J.UQ(z.t(a,"code"),"start"),16,null))
-if(x==null){w=L.CQ(z.t(a,"kind"))
-v=z.t(a,"code")
-z=J.U6(v)
-u=H.BU(z.t(v,"start"),16,null)
-t=H.BU(z.t(v,"end"),16,null)
-s=z.t(v,"name")
-r=z.t(v,"user_name")
-q=R.Jk([])
-p=H.B7([],P.L5(null,null,null,null,null))
-p=R.Jk(p)
-o=H.B7([],P.L5(null,null,null,null,null))
-o=R.Jk(o)
-x=new L.kx(w,u,t,[],[],[],0,0,q,p,o,s,null,null,null)
-x.uP=F.Wi(x,C.EX,o,v)
-o=z.t(v,"function")
-q=R.Jk(o)
-x.Qo=F.Wi(x,C.yg,x.Qo,q)
-x.B0=F.Wi(x,C.ct,x.B0,r)
-if(z.t(v,"disassembly")!=null){x.fo(z.t(v,"disassembly"))
-z.u(v,"disassembly",null)}J.bi(y.gZ0(),x)}J.eh(x,a)
-this.jV.push(x)},"call$1","gXx",2,0,null,544,[]],
-T0:[function(a){var z,y
-z=this.Aq.gZ0()
-y=J.w1(z)
-y.GT(z,new L.vu())
-if(J.u6(y.gB(z),a)||J.de(a,0))return z
-return y.D6(z,0,a)},"call$1","gy8",2,0,null,122,[]],
-uH:function(a,b){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"codes")
-this.hV=z.t(b,"samples")
-z=J.U6(y)
-N.Jx("").To("Creating profile from "+H.d(this.hV)+" samples and "+H.d(z.gB(y))+" code objects.")
-this.Aq.R7()
-x=this.jV
-C.Nm.sB(x,0)
-z.aN(y,new L.xn(this))
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-if(w>=x.length)return H.e(x,w)
-x[w].hI(z.t(y,w),x);++w}C.Nm.sB(x,0)},
-static:{hh:function(a,b){var z=new L.CM(a,H.VM([],[L.kx]),0)
-z.uH(a,b)
-return z}}},
-xn:{
-"^":"Tp:225;a",
-call$1:[function(a){var z,y,x,w
-try{this.a.U5(a)}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-N.Jx("").xH("Error processing code object. "+H.d(z)+" "+H.d(y),z,y)}},"call$1",null,2,0,null,136,[],"call"],
-$isEH:true},
-vu:{
-"^":"Tp:545;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,123,[],183,[],"call"],
-$isEH:true},
-c2:{
-"^":["Pi;Rd>-484,eB,P2,AP,fn",function(){return[C.mI]},null,null,null,null],
-gu9:[function(){return this.eB},null,null,1,0,491,"hits",353,370],
-su9:[function(a){this.eB=F.Wi(this,C.K7,this.eB,a)},null,null,3,0,392,23,[],"hits",353],
-ga4:[function(a){return this.P2},null,null,1,0,367,"text",353,370],
-sa4:[function(a,b){this.P2=F.Wi(this,C.MB,this.P2,b)},null,null,3,0,25,23,[],"text",353],
-goG:function(){return J.J5(this.eB,0)},
-gVt:function(){return J.z8(this.eB,0)},
-$isc2:true},
-rj:{
-"^":["Pi;W6,xN,ei,Hz,Sw<-546,UK,AP,fn",null,null,null,null,function(){return[C.mI]},null,null,null],
-gfY:[function(a){return this.W6},null,null,1,0,367,"kind",353,370],
-sfY:[function(a,b){this.W6=F.Wi(this,C.fy,this.W6,b)},null,null,3,0,25,23,[],"kind",353],
-gKC:[function(){return this.xN},null,null,1,0,352,"scriptRef",353,370],
-sKC:[function(a){this.xN=F.Wi(this,C.Be,this.xN,a)},null,null,3,0,355,23,[],"scriptRef",353],
-gQT:[function(){return this.ei},null,null,1,0,367,"shortName",353,354],
-sQT:[function(a){this.ei=F.Wi(this,C.Kt,this.ei,a)},null,null,3,0,25,23,[],"shortName",353],
-gBi:[function(){return this.Hz},null,null,1,0,352,"libraryRef",353,370],
-sBi:[function(a){this.Hz=F.Wi(this,C.cg,this.Hz,a)},null,null,3,0,355,23,[],"libraryRef",353],
-giI:function(){return this.UK},
-gHh:[function(){return J.Pr(this.Sw,1)},null,null,1,0,547,"linesForDisplay",370],
-Av:[function(a){var z,y,x,w
-z=this.Sw
-y=J.U6(z)
-x=J.Wx(a)
-if(x.F(a,y.gB(z)))y.sB(z,x.g(a,1))
-w=y.t(z,a)
-if(w==null){w=new L.c2(a,-1,"",null,null)
-y.u(z,a,w)}return w},"call$1","gKN",2,0,null,548,[]],
-lu:[function(a){var z,y,x,w
-if(a==null)return
-N.Jx("").To("Loading source for "+H.d(J.UQ(this.xN,"name")))
-z=J.uH(a,"\n")
-this.UK=z.length===0
-for(y=0;y<z.length;y=x){x=y+1
-w=this.Av(x)
-if(y>=z.length)return H.e(z,y)
-J.c9(w,z[y])}},"call$1","ghH",2,0,null,27,[]],
-o6:[function(a){var z,y,x
-z=J.U6(a)
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-this.Av(z.t(a,y)).su9(z.t(a,y+1))
-y+=2}F.Wi(this,C.C2,"","("+C.CD.yM(this.Nk(),1)+"% covered)")},"call$1","gpc",2,0,null,549,[]],
-Nk:[function(){var z,y,x,w
-for(z=J.GP(this.Sw),y=0,x=0;z.G();){w=z.gl()
-if(w==null)continue
-if(!w.goG())continue;++x
-if(!w.gVt())continue;++y}if(x===0)return 0
-return y/x*100},"call$0","gCx",0,0,538,"coveredPercentage",370],
-nZ:[function(){return"("+C.CD.yM(this.Nk(),1)+"% covered)"},"call$0","gic",0,0,367,"coveredPercentageFormatted",370],
-Ea:function(a){var z,y
-z=J.U6(a)
-y=H.B7(["id",z.t(a,"id"),"name",z.t(a,"name"),"user_name",z.t(a,"user_name")],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-this.xN=F.Wi(this,C.Be,this.xN,y)
-y=J.ZZ(z.t(a,"name"),J.WB(J.eJ(z.t(a,"name"),"/"),1))
-this.ei=F.Wi(this,C.Kt,this.ei,y)
-y=z.t(a,"library")
-y=R.Jk(y)
-this.Hz=F.Wi(this,C.cg,this.Hz,y)
-y=z.t(a,"kind")
-this.W6=F.Wi(this,C.fy,this.W6,y)
-this.lu(z.t(a,"source"))},
-$isrj:true,
-static:{Ak:function(a){var z,y,x
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=H.B7([],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-x=H.VM([],[L.c2])
-x=R.Jk(x)
-x=new L.rj(null,z,null,y,x,!0,null,null)
-x.Ea(a)
-return x}}},
-Nu:{
-"^":"Pi;XT?,e0?",
-pG:function(){return this.e0.call$0()},
-geG:[function(){return this.SI},null,null,1,0,367,"prefix",353,370],
-seG:[function(a){this.SI=F.Wi(this,C.qb3,this.SI,a)},null,null,3,0,25,23,[],"prefix",353],
-gjR:[function(){return this.Tj},null,null,1,0,510,"responses",353,370],
-sjR:[function(a){this.Tj=F.Wi(this,C.wH,this.Tj,a)},null,null,3,0,550,23,[],"responses",353],
-FH:[function(a){var z,y,x,w,v
-z=null
-try{z=C.xr.kV(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-this.AI(H.d(y)+" "+H.d(x))}return z},"call$1","gkJ",2,0,null,477,[]],
-f3:[function(a){var z,y
-z=this.FH(a)
-if(z==null)return
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)this.dq([z])
-else this.dq(z)},"call$1","gI5",2,0,null,551,[]],
-dq:[function(a){var z=R.Jk(a)
-this.Tj=F.Wi(this,C.wH,this.Tj,z)
-if(this.e0!=null)this.pG()},"call$1","gvw",2,0,null,373,[]],
-AI:[function(a){this.dq([H.B7(["type","Error","errorType","ResponseError","text",a],P.L5(null,null,null,null,null))])
-N.Jx("").hh(a)},"call$1","gug",2,0,null,20,[]],
-Uu:[function(a){var z,y,x,w,v
-z=L.Lw(a)
-if(z==null){this.AI(z+" is not an isolate id.")
-return}y=this.XT.nI.AQ(z)
-if(y==null){this.AI(z+" could not be found.")
-return}x=L.CX(a)
-w=J.x(x)
-if(w.n(x,0)){this.AI(a+" is not a valid code request.")
-return}v=y.hv(x)
-if(v!=null){N.Jx("").To("Found code with 0x"+w.WZ(x,16)+" in isolate.")
-this.dq([H.B7(["type","Code","code",v],P.L5(null,null,null,null,null))])
-return}this.ym(0,a).ml(new L.Q4(this,y,x)).OA(this.gSC())},"call$1","gVB",2,0,null,552,[]],
-GY:[function(a){var z,y,x,w,v
-z=L.Lw(a)
-if(z==null){this.AI(z+" is not an isolate id.")
-return}y=this.XT.nI.AQ(z)
-if(y==null){this.AI(z+" could not be found.")
-return}x=L.CB(a)
-if(x==null){this.AI(a+" is not a valid script request.")
-return}w=J.UQ(y.gXR(),x)
-v=w!=null
-if(v&&!w.giI()){N.Jx("").To("Found script "+H.d(J.UQ(w.gKC(),"name"))+" in isolate")
-this.dq([H.B7(["type","Script","script",w],P.L5(null,null,null,null,null))])
-return}if(v){this.fB(a).ml(new L.aJ(this,w))
-return}this.fB(a).ml(new L.u4(this,y,x))},"call$1","gPc",2,0,null,552,[]],
-xl:[function(a,b){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isew){z=W.qc(a.target)
-y=J.RE(z)
-x=H.d(y.gys(z))+" "+y.gpo(z)
-if(y.gys(z)===0)x="No service found. Did you run with --enable-vm-service ?"
-this.dq([H.B7(["type","Error","errorType","RequestError","text",x],P.L5(null,null,null,null,null))])}else this.AI(H.d(a)+" "+H.d(b))},"call$2","gSC",4,0,553,18,[],478,[]],
-ox:[function(a){var z=$.mE().Ej
-if(z.test(a)){this.Uu(a)
-return}z=$.Ww().Ej
-if(z.test(a)){this.GY(a)
-return}this.ym(0,a).ml(new L.pF(this)).OA(this.gSC())},"call$1","gRD",2,0,null,552,[]],
-fB:[function(a){return this.ym(0,C.xB.nC(a,"#")?C.xB.yn(a,1):a).ml(new L.Q2())},"call$1","gHi",2,0,null,552,[]]},
-Q4:{
-"^":"Tp:225;a,b,c",
-call$1:[function(a){var z,y,x,w,v,u,t
-z=this.a
-y=z.FH(a)
-if(y==null)return
-x=R.Jk([])
-w=H.B7([],P.L5(null,null,null,null,null))
-w=R.Jk(w)
-v=H.B7([],P.L5(null,null,null,null,null))
-v=R.Jk(v)
-u=J.U6(y)
-t=new L.kx(C.l8,H.BU(u.t(y,"start"),16,null),H.BU(u.t(y,"end"),16,null),[],[],[],0,0,x,w,v,null,null,null,null)
-t.NV(y)
-N.Jx("").To("Added code with 0x"+J.u1(this.c,16)+" to isolate.")
-J.bi(this.b.gZ0(),t)
-z.dq([H.B7(["type","Code","code",t],P.L5(null,null,null,null,null))])},"call$1",null,2,0,null,551,[],"call"],
-$isEH:true},
-aJ:{
-"^":"Tp:225;a,b",
-call$1:[function(a){var z=this.b
-z.lu(J.UQ(a,"source"))
-N.Jx("").To("Grabbed script "+H.d(J.UQ(z.gKC(),"name"))+" source.")
-this.a.dq([H.B7(["type","Script","script",z],P.L5(null,null,null,null,null))])},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-u4:{
-"^":"Tp:225;c,d,e",
-call$1:[function(a){var z=L.Ak(a)
-N.Jx("").To("Added script "+H.d(J.UQ(z.xN,"name"))+" to isolate.")
-this.c.dq([H.B7(["type","Script","script",z],P.L5(null,null,null,null,null))])
-J.kW(this.d.gXR(),this.e,z)},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-pF:{
-"^":"Tp:225;a",
-call$1:[function(a){this.a.f3(a)},"call$1",null,2,0,null,551,[],"call"],
-$isEH:true},
-Q2:{
-"^":"Tp:225;",
-call$1:[function(a){var z,y,x
-try{z=C.xr.kV(a)
-y=R.Jk(z)
-return y}catch(x){H.Ru(x)}return},"call$1",null,2,0,null,477,[],"call"],
-$isEH:true},
-r1:{
-"^":"Nu;XT,e0,SI,Tj,AP,fn",
-ym:[function(a,b){N.Jx("").To("Requesting "+b)
-return W.It(J.WB(this.SI,b),null,null)},"call$1","gkq",2,0,null,552,[]]},
-Rb:{
-"^":"Nu;eA,Wj,XT,e0,SI,Tj,AP,fn",
-AJ:[function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.UQ(z.gRn(a),"id")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.de(x,"observatoryData"))return
-z=this.eA
-v=z.t(0,y)
-if(v!=null){z.Rz(0,y)
-P.JS("Completing "+H.d(y))
-J.Xf(v,w)}else P.JS("Could not find completer for "+H.d(y))},"call$1","gpJ",2,0,153,19,[]],
-ym:[function(a,b){var z,y,x
-z=""+this.Wj
-y=H.B7([],P.L5(null,null,null,null,null))
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-y.u(0,"query",b)
-this.Wj=this.Wj+1
-x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.eA.u(0,z,x)
-J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gkq",2,0,null,552,[]]},
-Y2:{
-"^":["Pi;eT>,yt<-484,wd>-485,oH<-486",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
-goE:function(a){return this.np},
-soE:function(a,b){var z=this.np
-this.np=b
-if(z!==b)if(b)this.C4(0)
-else this.o8()},
-r8:[function(){this.soE(0,!this.np)
-return this.np},"call$0","gMk",0,0,null],
-$isY2:true},
-XN:{
-"^":["Pi;JL,WT>-485,AP,fn",null,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","gE3",2,0,null,554,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.ad(z)
-else this.cB(z)},"call$1","gMk",2,0,null,555,[]],
-ad:[function(a){var z,y,x,w,v,u,t
-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","ghF",2,0,null,498,[]],
-cB:[function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.q8(z.gwd(a))
-if(J.de(y,0))return
-if(typeof y!=="number")return H.s(y)
-x=0
-for(;x<y;++x)if(J.YV(J.UQ(z.gwd(a),x))===!0)this.cB(J.UQ(z.gwd(a),x))
-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","gjc",2,0,null,498,[]]}}],["observatory_application_element","package:observatory/src/observatory_elements/observatory_application.dart",,V,{
+return a},null,null,0,0,113,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[560],
+Vba:{
+"^":"PO+Pi;",
+$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V18;k5%-360,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gzj:[function(a){return a.k5},null,null,1,0,371,"devtools",353,354],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,372,23,[],"devtools",353],
+"^":["waa;k5%-417,xH%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gzj:[function(a){return a.k5},null,null,1,0,380,"devtools",355,397],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,381,23,[],"devtools",355],
+guw:[function(a){return a.xH},null,null,1,0,408,"app",355,356],
+suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,551,23,[],"app",355],
 ZB:[function(a){var z,y
-if(a.k5===!0){z=P.L5(null,null,null,null,null)
-y=R.Jk([])
-y=new L.Rb(z,0,null,null,"http://127.0.0.1:8181",y,null,null)
-z=C.ph.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gpJ()),z.Sg),[H.Kp(z,0)]).Zz()
-z=P.L5(null,null,null,J.O,L.bv)
-z=R.Jk(z)
-z=new L.mL(new L.dZ(null,!1,"",null,null,null),y,new L.yU(null,z,null,null),null,null)
+if(a.k5===!0){z=new G.ho(P.L5(null,null,null,null,null),0,null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null)
+y=C.ph.aM(window)
+H.VM(new W.Ov(0,y.uv,y.Ph,W.aF(z.gcW()),y.Sg),[H.Kp(y,0)]).Zz()
+P.JS("Connected to DartiumVM")
+z=new G.mL(new G.dZ(null,!1,"",null,null,null),z,null,null,null,null)
 z.hq()
-a.hm=this.ct(a,C.wh,a.hm,z)}else{z=R.Jk([])
-y=P.L5(null,null,null,J.O,L.bv)
-y=R.Jk(y)
-y=new L.mL(new L.dZ(null,!1,"",null,null,null),new L.r1(null,null,"http://127.0.0.1:8181",z,null,null),new L.yU(null,y,null,null),null,null)
-y.US()
-a.hm=this.ct(a,C.wh,a.hm,y)}},null,null,0,0,108,"created"],
-"@":function(){return[C.y2]},
+a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new G.mL(new G.dZ(null,!1,"",null,null,null),new G.XK("http://127.0.0.1:8181/",null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null),null,null,null,null)
+z.US()
+a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,113,"created"],
+"@":function(){return[C.kR]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19799,21 +19821,18 @@
 C.k0.ZL(a)
 C.k0.G6(a)
 C.k0.ZB(a)
-return a},null,null,0,0,108,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[556],
-V18:{
+return a},null,null,0,0,113,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[561],
+waa:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/observatory_elements/observatory_element.dart",,Z,{
+$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["LP;hm%-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,107,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,107,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,557,12,[],227,[],228,[],"attributeChanged"],
-guw:[function(a){return a.hm},null,null,1,0,558,"app",353,354],
-suw:[function(a,b){a.hm=this.ct(a,C.wh,a.hm,b)},null,null,3,0,559,23,[],"app",353],
-Dy:[function(a,b){},"call$1","gpx",2,0,153,227,[],"appChanged"],
-gpQ:[function(a){return!0},null,null,1,0,371,"applyAuthorStyles"],
+"^":["ir;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,112,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,112,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,562,12,[],233,[],234,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,380,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.p0(b,1000))
@@ -19823,28 +19842,28 @@
 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,560,561,[],"formatTime"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,563,564,[],"formatTime"],
 Ze:[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,394,562,[],"formatSize"],
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,444,565,[],"formatSize"],
 bj:[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,563,564,[],"fileAndLine"],
-nt:[function(a,b){return J.de(b,"@Null")},"call$1","gYx",2,0,565,11,[],"isNullRef"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,566,567,[],"fileAndLine"],
+nt:[function(a,b){return J.de(b,"@Null")},"call$1","gYx",2,0,568,11,[],"isNullRef"],
 Qq:[function(a,b){var z=J.x(b)
-return z.n(b,"@Smi")||z.n(b,"@Mint")||z.n(b,"@Bigint")},"call$1","gBI",2,0,565,11,[],"isIntRef"],
-TJ:[function(a,b){return J.de(b,"@Bool")},"call$1","gX4",2,0,565,11,[],"isBoolRef"],
-qH:[function(a,b){return J.de(b,"@String")},"call$1","gwm",2,0,565,11,[],"isStringRef"],
-JG:[function(a,b){return J.de(b,"@Instance")},"call$1","gUq",2,0,565,11,[],"isInstanceRef"],
-CL:[function(a,b){return J.de(b,"@Closure")},"call$1","gj7",2,0,565,11,[],"isClosureRef"],
+return z.n(b,"@Smi")||z.n(b,"@Mint")||z.n(b,"@Bigint")},"call$1","gBI",2,0,568,11,[],"isIntRef"],
+TJ:[function(a,b){return J.de(b,"@Bool")},"call$1","gX4",2,0,568,11,[],"isBoolRef"],
+qH:[function(a,b){return J.de(b,"@String")},"call$1","gwm",2,0,568,11,[],"isStringRef"],
+JG:[function(a,b){return J.de(b,"@Instance")},"call$1","gUq",2,0,568,11,[],"isInstanceRef"],
+CL:[function(a,b){return J.de(b,"@Closure")},"call$1","gj7",2,0,568,11,[],"isClosureRef"],
 Bk:[function(a,b){var z=J.x(b)
-return z.n(b,"@GrowableObjectArray")||z.n(b,"@Array")},"call$1","gmv",2,0,565,11,[],"isListRef"],
-VR:[function(a,b){return!C.Nm.tg(["@Null","@Smi","@Mint","@Biginit","@Bool","@String","@Closure","@Instance","@GrowableObjectArray","@Array"],b)},"call$1","gua",2,0,565,11,[],"isUnexpectedRef"],
+return z.n(b,"@GrowableObjectArray")||z.n(b,"@Array")},"call$1","gmv",2,0,568,11,[],"isListRef"],
+VR:[function(a,b){return!C.Nm.tg(["@Null","@Smi","@Mint","@Biginit","@Bool","@String","@Closure","@Instance","@GrowableObjectArray","@Array"],b)},"call$1","gua",2,0,568,11,[],"isUnexpectedRef"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19857,15 +19876,12 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.G6(a)
-return a},null,null,0,0,108,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
+return a},null,null,0,0,113,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
 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,240,23,[],241,[],"_zeroPad"]}},
-"+ObservatoryElement":[566],
-LP:{
-"^":"ir+Pi;",
-$isd3:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","px",4,0,243,23,[],244,[],"_zeroPad"]}},
+"+ObservatoryElement":[569]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19874,8 +19890,8 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"call$0","gqw",0,0,107],
-ni:[function(a){a.AP=null},"call$0","gl1",0,0,107],
+k0:[function(a){},"call$0","gqw",0,0,112],
+ni:[function(a){a.AP=null},"call$0","gl1",0,0,112],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -19885,20 +19901,20 @@
 if(x&&z!=null){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,371],
+return!0}return!1},"call$0","gDx",0,0,380],
 gUV: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,254,[],227,[],228,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,257,[],233,[],234,[]],
 nq:[function(a,b){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},"call$1","giA",2,0,null,22,[]],
+P.rb(this.gDx(a))}a.fn.push(b)},"call$1","gbW",2,0,null,22,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
@@ -19913,7 +19929,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 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,108,"value",353],
+gP:[function(a){return this.Sv},null,null,1,0,113,"value",355],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19927,14 +19943,14 @@
 x.push(w)}this.Ow()},"call$0","gM",0,0,null],
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"call$1","geu",2,0,153,237,[]],
+P.rb(this.gMc())},"call$1","geu",2,0,158,108,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,107],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,112],
 cO:[function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -19942,11 +19958,11 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},"call$0","gJK",0,0,null],
-k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,108],
-ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,108],
+k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,113],
+ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,113],
 $isJ3:true},
 E5:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
@@ -19964,48 +19980,49 @@
 $.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-s=s.iE!==s
+if(s!=null){r=s.iE
+s=r==null?s!=null:r!==s}else s=!1
 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();){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
+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
 $.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:567;a",
+"^":"Tp:570;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"call$2",null,4,0,null,165,[],146,[],"call"],
+a.RK(b,new O.b5(z))},"call$2",null,4,0,null,170,[],151,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){this.a.a=!1
 O.Y3()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:166;b",
+"^":"Tp:171;b",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,164,[],165,[],146,[],110,[],"call"],
+return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:108;c,d,e,f",
+"^":"Tp:113;c,d,e,f",
 call$0:[function(){this.c.call$2(this.d,this.e)
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:568;UI",
+"^":"Tp:571;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,164,[],165,[],146,[],110,[],"call"],
+return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:225;bK,Gq,Rm,w3",
+"^":"Tp:107;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,21,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
@@ -20045,7 +20062,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,242,[],243,[],244,[],245,[],246,[],247,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -20080,10 +20097,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,248,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,251,[]],
 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,249,[],250,[],251,[]],
+return c},"call$3","UF",6,0,null,252,[],253,[],254,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -20094,7 +20111,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,249,[],250,[],251,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,252,[],253,[],254,[]],
 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)
@@ -20144,7 +20161,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","Lr",12,0,null,242,[],243,[],244,[],245,[],246,[],247,[]],
+return p},"call$6","Lr",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b.gWA()
 y=J.zj(b)
@@ -20183,11 +20200,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,252,[],22,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,255,[],22,[]],
 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,68,[],253,[]],
+return z},"call$2","bN",4,0,null,68,[],256,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -20197,7 +20214,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","SI",4,0,null,68,[],253,[]],
+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,68,[],256,[]],
 DA:{
 "^":"a;WA<,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -20210,7 +20227,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,42,[]],
+return a<z},"call$1","gw9",2,0,null,42,[]],
 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
@@ -20220,19 +20237,79 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-ndx:{
-"^":"a;"},
+nd:{
+"^":"a;",
+$isnd:true},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gUV(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,93,[],254,[],227,[],228,[]],
+return d},"call$4","T7",8,0,null,93,[],257,[],233,[],234,[]],
 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)])},
+gUV: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.x(u)
+if(typeof u!=="object"||u===null||!z.$isRY||u.gV5()||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,112],
+B0:[function(){if(this.V2!=null){this.wv=null
+this.V2=null}},"call$0","gkk",0,0,112],
+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,257,[],233,[],234,[]],
+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","gbW",2,0,null,22,[]],
 $isd3:true},
 lS:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -20242,14 +20319,14 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],227,[],"call"],
+z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],233,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
 "^":"Pi;L1,AP,fn",
-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",353],
+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",355],
 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")},228,[],"value",353],
+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")},234,[],"value",355],
 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:{
@@ -20258,7 +20335,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,491,"length",353],
+gB:[function(a){return this.h3.length},null,null,1,0,371,"length",355],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -20286,10 +20363,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,392,23,[],"length",353],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,372,23,[],"length",355],
 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:"Zg",ret:a,args:[J.im]}},this.$receiver,"wn")},47,[],"[]",353],
+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")},47,[],"[]",355],
 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)
@@ -20301,9 +20378,9 @@
 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")},47,[],23,[],"[]=",353],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,371,"isEmpty",353],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,371,"isNotEmpty",353],
+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")},47,[],23,[],"[]=",355],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,380,"isEmpty",355],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,380,"isNotEmpty",355],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -20322,10 +20399,10 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,109,[]],
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,114,[]],
 Rz:[function(a,b){var z,y
 for(z=this.h3,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},"call$1","gRI",2,0,null,124,[]],
+return!0}return!1},"call$1","gRI",2,0,null,129,[]],
 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))
@@ -20353,7 +20430,7 @@
 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,115,[],116,[]],
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,120,[],121,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
@@ -20369,7 +20446,7 @@
 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,47,[],124,[]],
+z[b]=c},"call$2","gQG",4,0,null,47,[],129,[]],
 KI:[function(a,b){var z,y
 z=this.h3
 if(b<0||b>=z.length)return H.e(z,b)
@@ -20388,7 +20465,7 @@
 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","gdX",4,0,null,227,[],228,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,233,[],234,[]],
 cv:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
@@ -20400,7 +20477,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,371],
+return!0}return!1},"call$0","gL6",0,0,380],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -20408,7 +20485,7 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){this.a.xg=null},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -20422,18 +20499,18 @@
 qC:{
 "^":"Pi;Zp,AP,fn",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"pD",ret:[P.cX,a]}},this.$receiver,"qC")},"keys",353],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"NE",ret:[P.cX,a]}},this.$receiver,"qC")},"keys",355],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"NE",ret:[P.cX,b]}},this.$receiver,"qC")},"values",353],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.cX,b]}},this.$receiver,"qC")},"values",355],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,491,"length",353],
+return z.gB(z)},null,null,1,0,371,"length",355],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,371,"isEmpty",353],
+return z.gB(z)===0},null,null,1,0,380,"isEmpty",355],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,371,"isNotEmpty",353],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,569,23,[],"containsValue",353],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,569,42,[],"containsKey",353],
-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")},42,[],"[]",353],
+return z.gB(z)!==0},null,null,1,0,380,"isNotEmpty",355],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,572,23,[],"containsValue",355],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,572,42,[],"containsKey",355],
+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")},42,[],"[]",355],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -20444,7 +20521,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:"fK",void:true,args:[a,b]}},this.$receiver,"qC")},42,[],23,[],"[]=",353],
+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:"fK",void:true,args:[a,b]}},this.$receiver,"qC")},42,[],23,[],"[]=",355],
 FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,104,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -20463,7 +20540,7 @@
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,110,[]],
+aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isZ0:true,
 static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
@@ -20479,7 +20556,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,42,[],23,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
@@ -20562,7 +20639,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,108,"value",353],
+return C.Nm.grZ(this.kN)},null,null,1,0,113,"value",355],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20579,16 +20656,16 @@
 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,456,228,[],"value",353],
+z[y]=b}},null,null,3,0,504,234,[],"value",355],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"call$0","gqw",0,0,107],
+this.XI()},"call$0","gqw",0,0,112],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,107],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,112],
 Zy:[function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -20604,7 +20681,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,77,116,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,77,121,[]],
 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
@@ -20622,7 +20699,7 @@
 t[s]=u}this.ij(a)
 if(this.gUV(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gWx",0,3,null,332,115,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,335,120,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20631,7 +20708,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,77,115,[],116,[]],
+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,335,77,120,[],121,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20655,7 +20732,7 @@
 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","gCf",2,0,null,390,[]],
+v[a]=w}}},"call$1","gCf",2,0,null,441,[]],
 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
@@ -20672,23 +20749,23 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:225;",
-call$1:[function(a){return},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:570;a,b,c",
+"^":"Tp:573;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,253,[],"call"],
+return}},"call$1",null,2,0,null,256,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:571;d,e,f",
+"^":"Tp:574;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,253,[],"call"],
+return}},"call$1",null,2,0,null,256,[],"call"],
 $isEH:true},
-Md:{
-"^":"Tp:108;",
+YJ:{
+"^":"Tp:113;",
 call$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
@@ -20700,10 +20777,10 @@
 return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,225,23,[]],
+return x}return a},"call$1","np",2,0,107,23,[]],
 km:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,427,[],274,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,402,[],277,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -20730,18 +20807,18 @@
 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,255,[],256,[]],
+b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,258,[],259,[]],
 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
 a=a.gAY()}while(!J.de(a,$.Tf()))
-return},"call$2","il",4,0,null,255,[],66,[]],
+return},"call$2","il",4,0,null,258,[],66,[]],
 bc:[function(a,b){var z,y
 z=H.le(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,255,[],257,[]],
+return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,258,[],260,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20750,7 +20827,7 @@
 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,258,[],12,[],259,[]],
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,261,[],12,[],262,[]],
 Hl:[function(a){var z,y,x,w,v,u,t
 if(a==null)return""
 w=J.RE(a)
@@ -20770,28 +20847,28 @@
 if(typeof w==="object"&&w!==null&&!!t.$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,260,[]],
+return""}else throw u}},"call$1","NI",2,0,null,263,[]],
 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,77,12,[],11,[]],
-zM:[function(a){A.Vx(a,new A.Mq())},"call$1","mo",2,0,null,261,[]],
+zM:[function(a){A.Vx(a,new A.Mq())},"call$1","jU",2,0,null,264,[]],
 Vx:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.Vx(z,b)},"call$2","Dv",4,0,null,261,[],151,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.Vx(z,b)},"call$2","Dv",4,0,null,264,[],156,[]],
 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,262,[],12,[],261,[],263,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,265,[],12,[],264,[],266,[]],
 Hr:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","Fd",2,0,null,261,[]],
+return $.od().t(0,a)},"call$1","Fd",2,0,null,264,[]],
 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,41,[],264,[],265,[]],
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,41,[],267,[],268,[]],
 Rk:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
@@ -20803,7 +20880,7 @@
 z.textContent=a.textContent
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,266,[],267,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,269,[],270,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
@@ -20821,7 +20898,7 @@
 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,23,[]],
+return},"call$1","v9",2,0,null,23,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20830,7 +20907,7 @@
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.Bl())},"call$0","PB",0,0,107],
+$.ax().ml(new A.Bl())},"call$0","PB",0,0,112],
 Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
@@ -20860,7 +20937,7 @@
 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,77,77,268,[],269,[],270,[],271,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,77,77,271,[],272,[],273,[],274,[]],
 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
@@ -20918,7 +20995,7 @@
 p=k.gYj()
 $.Ej().u(0,q,p)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,272,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,275,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.za){y=!0
 break}if(!y)return
@@ -20932,10 +21009,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.call$1(x)
-return}a.CI(b.gIf(),C.xD)},"call$2","K0n",4,0,null,93,[],217,[]],
+return}a.CI(b.gIf(),C.xD)},"call$2","K0n",4,0,null,93,[],224,[]],
 Zj:{
-"^":"Tp:225;",
-call$1:[function(a){A.pX()},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){A.pX()},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,Ei",
@@ -20983,7 +21060,7 @@
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
 return!0},"call$1","gLD",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,259,[]],
+return!0}return!1},"call$1","gmL",2,0,null,262,[]],
 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")
@@ -21011,14 +21088,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,255,[],572,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,258,[],575,[]],
 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,573,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,576,[]],
 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],
@@ -21044,7 +21121,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,77,462,[],574,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,77,510,[],577,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -21055,14 +21132,14 @@
 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,575,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,578,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 z.textContent=b
 z.toString
 z.setAttribute("element",a.RT+"-"+c)
-return z},"call$2","gNG",4,0,null,576,[],575,[]],
+return z},"call$2","gNG",4,0,null,579,[],578,[]],
 q1:[function(a,b){var z,y,x,w
 if(J.de(b,$.Tf()))return
 this.q1(a,b.gAY())
@@ -21073,10 +21150,10 @@
 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.le(w)),y.gIf())}}},"call$1","gHv",2,0,null,255,[]],
+a.hf.u(0,new H.GD(H.le(w)),y.gIf())}}},"call$1","gHv",2,0,null,258,[]],
 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,577,[]],
+return z},"call$1","gir",2,0,null,580,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -21085,15 +21162,15 @@
 C.xk.du(a)
 return a}}},
 q6:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,[],23,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,"{{")
@@ -21101,32 +21178,32 @@
 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,[],23,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,86,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:343;a",
+"^":"Tp:346;a",
 call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],23,[],"call"],
 $isEH:true},
-w9:{
-"^":"Tp:108;",
+w10:{
+"^":"Tp:113;",
 call$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:343;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,578,[],579,[],"call"],
+"^":"Tp:346;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,581,[],582,[],"call"],
 $isEH:true},
 yL:{
-"^":"ndx;",
+"^":"nd;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-351",function(){return[C.nJ]}],
+"^":["a;KM:X0=-412",function(){return[C.nJ]}],
 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
@@ -21139,12 +21216,12 @@
 this.Uc(a)
 $.Bh=$.Bh+1
 this.z2(a,a.dZ)
-$.Bh=$.Bh-1},"call$0","gLi",0,0,null],
+$.Bh=$.Bh-1},"call$0","gUr",0,0,null],
 i4:[function(a){if(a.dZ==null)this.Ec(a)
 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,580,[]],
+this.d0(a,b)}},"call$1","gET",2,0,null,583,[]],
 d0:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=z.Ja(b,"template")
@@ -21155,7 +21232,7 @@
 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,581,[]],
+a.B7.u(0,v,x)},"call$1","gcY",2,0,null,584,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
 z=J.x(b)
@@ -21163,7 +21240,7 @@
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,258,[]],
+return y},"call$1","gAt",2,0,null,261,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
 this.gKE(a)
@@ -21175,12 +21252,12 @@
 y=typeof b==="object"&&b!==null&&!!y.$ishs?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,258,[]],
+return z},"call$1","gQb",2,0,null,261,[]],
 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,582,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,585,[]],
 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,[],227,[],228,[]],
+if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
 fk:[function(a){if(J.ak(a.dZ)==null)return
 this.gQg(a).aN(0,this.ghW(a))},"call$0","goQ",0,0,null],
@@ -21191,7 +21268,7 @@
 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,583,12,[],23,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,586,12,[],23,[]],
 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,[]],
@@ -21222,7 +21299,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,77,12,[],282,[],262,[]],
+return t}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
 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
@@ -21243,14 +21320,14 @@
 J.AA(M.Ky(a))
 y=this.gKE(a)
 for(;y!=null;){A.zM(y)
-y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,107],
+y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,112],
 BT:[function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+this.gqn(a)+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+this.gqn(a)+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.Vx(this.gKE(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,77,584,[]],
+A.Vx(this.gKE(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,77,587,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
@@ -21264,7 +21341,7 @@
 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,585,586,[]],
+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,588,589,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -21284,7 +21361,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,[],23,[],245,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],23,[],248,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -21308,7 +21385,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,261,[],587,[],294,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,264,[],590,[],297,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -21320,7 +21397,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+this.gqn(a)+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,588,410,[]],
+this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,591,384,[]],
 ea:[function(a,b,c,d){var z,y,x
 z=$.SS()
 y=z.Im(C.R5)
@@ -21329,7 +21406,7 @@
 if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.le(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},"call$3","gtW",6,0,null,6,[],589,[],265,[]],
+if(y)z.To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},"call$3","gtW",6,0,null,6,[],592,[],268,[]],
 $iszs:true,
 $ishs:true,
 $isd3:true,
@@ -21338,31 +21415,31 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,[],23,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:108;b",
+"^":"Tp:113;b",
 call$0:[function(){return this.b},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 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,289,[],"call"],
+if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,292,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a))},"call$1",null,2,0,null,261,[],"call"],
+return J.AA(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a))},"call$1",null,2,0,null,264,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:343;b,c,d,e",
+"^":"Tp:346;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)
@@ -21372,26 +21449,26 @@
 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,[],590,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],593,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:225;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:107;a,b,c",
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,589,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:343;a,b",
+"^":"Tp:346;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+"())")
-y=J.ZZ(this.b,3)
+y=J.D8(this.b,3)
 x=C.FS.t(0,y)
 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,282,[],261,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,285,[],264,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:225;c,d,e",
+"^":"Tp:107;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.Hr(z)
@@ -21403,25 +21480,25 @@
 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,410,[],"call"],
+x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,384,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:225;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 x.h(0,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,237,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,237,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -21429,17 +21506,17 @@
 this.Jq.ed()
 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,228,[]],
+this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,234,[]],
 ho:[function(a){var z,y,x,w,v
 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()
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,592,253,[]],
+return}}},"call$1","giz",2,0,595,256,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["GN;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -21454,7 +21531,7 @@
 C.Iv.G6(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-351",function(){return[C.nJ]}],
+"^":["qE+zs;KM:X0=-412",function(){return[C.nJ]}],
 $iszs:true,
 $ishs:true,
 $isd3:true,
@@ -21477,30 +21554,30 @@
 if(z!=null){z.ed()
 this.ih=null}},"call$0","gol",0,0,null],
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"call$0","gv6",0,0,107]},
+this.Ws()}},"call$0","gv6",0,0,112]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 Bl:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
-return},"call$1",null,2,0,null,237,[],"call"],
+return},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,593,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,596,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,593,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,596,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:225;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
 $isEH:true},
 jh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
@@ -21510,9 +21587,9 @@
 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,23,[],273,[],11,[]],
+return a}},"call$3","jo",6,0,null,23,[],276,[],11,[]],
 W6:{
-"^":"Tp:108;",
+"^":"Tp:113;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
@@ -21523,59 +21600,59 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],237,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],237,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 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,21,[],594,[],"call"],
+return b}},"call$2",null,4,0,null,21,[],597,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:343;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,21,[],237,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,21,[],108,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:343;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,21,[],594,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:225;a",
-call$1:[function(a){return this.a},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return this.a},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:343;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,21,[],594,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:225;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
 $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.$iscX)?z.zV(a," "):a
-return z},"call$1","qP",2,0,190,274,[]],
+return z},"call$1","qP",2,0,195,277,[]],
 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.$iscX)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,190,274,[]],
+return z},"call$1","Fx",2,0,195,277,[]],
 o8:{
-"^":"Tp:225;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,427,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,402,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:225;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,427,[],"call"],
+"^":"Tp:107;a",
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,402,[],"call"],
 $isEH:true},
 e9:{
-"^":"ve;",
+"^":"T4;",
 cl:[function(a,b,c){var z,y,x
 if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
@@ -21590,24 +21667,24 @@
 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
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,595,262,[],12,[],261,[]],
-CE:[function(a){return new T.G0(this)},"call$1","gb4",2,0,null,258,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,598,265,[],12,[],264,[]],
+CE:[function(a){return new T.G0(this)},"call$1","gb4",2,0,null,261,[]]},
 Xy:{
-"^":"Tp:343;a,b,c",
+"^":"Tp:346;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
 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,282,[],261,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,285,[],264,[],"call"],
 $isEH:true},
 G0:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$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,282,[],"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,285,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,fn",
@@ -21617,14 +21694,14 @@
 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)
 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,225,274,[]],
-gP:[function(a){return this.Y7},null,null,1,0,108,"value",353],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,107,277,[]],
+gP:[function(a){return this.Y7},null,null,1,0,113,"value",355],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 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,225,274,[],"value",353],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,107,277,[],"value",355],
 yB:function(a,b,c){var z,y,x,w,v
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -21638,14 +21715,14 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:225;a",
+"^":"Tp:107;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,18,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:225;a,b",
+"^":"Tp:107;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,390,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,441,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -21658,13 +21735,13 @@
 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,390,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,441,[],"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,275,[],267,[]],
+return z.gLv()},"call$2","ly",4,0,null,278,[],270,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -21694,79 +21771,79 @@
 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.le(u)),b)},"call$3","wA",6,0,null,275,[],23,[],267,[]],
+else H.vn(p).PU(new H.GD(H.le(u)),b)},"call$3","wA",6,0,null,278,[],23,[],270,[]],
 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,274,[]],
-lP:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
-$isEH:true},
+return a},"call$1","Af",2,0,null,277,[]],
 Uf:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 Ra:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.p0(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.p0(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:343;",
-call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:343;",
-call$2:[function(a,b){return J.Hb(a,b)},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return J.Hb(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:343;",
-call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,123,[],183,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:343;",
+"^":"Tp:346;",
+call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
+$isEH:true},
+w4:{
+"^":"Tp:346;",
 call$2:[function(a,b){var z=H.uK(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,123,[],110,[],"call"],
-$isEH:true},
-w4:{
-"^":"Tp:225;",
-call$1:[function(a){return a},"call$1",null,2,0,null,123,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,128,[],115,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:225;",
-call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,123,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return a},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:225;",
-call$1:[function(a){return a!==!0},"call$1",null,2,0,null,123,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,128,[],"call"],
+$isEH:true},
+w9:{
+"^":"Tp:107;",
+call$1:[function(a){return a!==!0},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:108;a",
+"^":"Tp:113;a",
 call$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
@@ -21808,11 +21885,11 @@
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-Qh:[function(a){},"call$1","gVj",2,0,null,267,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,270,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,267,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,270,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21821,14 +21898,14 @@
 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,267,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,270,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
 "^":"cfS;Jd",
 xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,18,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gXf",2,0,null,280,[]]},
+a.yc(0,this.Jd)},"call$1","gXf",2,0,null,283,[]]},
 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,18,[]],
@@ -21837,14 +21914,14 @@
 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,348,[]],
+return y},"call$1","gEW",2,0,null,351,[]],
 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,390,[]],
+return x},"call$1","gA2",2,0,null,441,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21854,21 +21931,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,390,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gXj",2,0,null,276,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,441,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gXj",2,0,null,279,[]],
 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","gX7",2,0,null,276,[]],
+return y},"call$1","gX7",2,0,null,279,[]],
 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","gvO",2,0,null,18,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,390,[]],
+return x},"call$1","ghH",2,0,null,18,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,441,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
@@ -21886,23 +21963,23 @@
 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","gXf",2,0,null,390,[]]},
+return x},"call$1","gXf",2,0,null,441,[]]},
 Os:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,123,[],"call"],
+return z},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
 return z},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay0;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.k8},"call$1","gVj",2,0,null,267,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gBu",2,0,null,274,[]],
+Qh:[function(a){this.Lv=a.k8},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -21912,27 +21989,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,267,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay0;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,267,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:343;",
+"^":"Tp:346;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,186,[],18,[],"call"],
+return a},"call$2",null,4,0,null,191,[],18,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay0;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
@@ -21947,19 +22024,19 @@
 y=a.tI(z.gP(z))
 x=J.RE(y)
 if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.le(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,267,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gBu",2,0,null,274,[]],
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:225;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,586,[],"call"],
+"^":"Tp:107;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,589,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay0;wz<,KL,bO,tj,Lv,k6",
@@ -21970,8 +22047,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,267,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -21993,14 +22070,14 @@
 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,267,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay0;hP<,KL,bO,tj,Lv,k6",
@@ -22013,19 +22090,19 @@
 x=new H.GD(H.le(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,267,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:225;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,586,[],"call"],
+"^":"Tp:107;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,589,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay0;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -22035,19 +22112,19 @@
 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,267,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 ja:{
-"^":"Tp:225;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.zw(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:107;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.zw(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
 $isEH:true},
 zw:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay0;hP<,re<,KL,bO,tj,Lv,k6",
@@ -22064,23 +22141,23 @@
 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.le(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,267,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gBu",2,0,null,274,[]],
+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,270,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:225;",
-call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,123,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,128,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:571;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,586,[],"call"],
+"^":"Tp:574;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,589,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:225;d",
+"^":"Tp:107;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,280,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay0;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -22092,21 +22169,21 @@
 if(typeof y==="object"&&y!==null&&!!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,267,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gBu",2,0,null,274,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,270,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
 $asAy0:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
 J1:{
-"^":"Tp:225;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;kF,bm",
 $isfk:true},
 wL:{
-"^":"a:225;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gtm",2,0,null,596,[]],
+"^":"a:107;lR,ex",
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gQl",2,0,null,599,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -22126,33 +22203,33 @@
 if(!(y<x))break
 x=z.t(a,y)
 if(y>=b.length)return H.e(b,y)
-if(!J.de(x,b[y]))return!1;++y}return!0},"call$2","OE",4,0,null,123,[],183,[]],
+if(!J.de(x,b[y]))return!1;++y}return!0},"call$2","OE",4,0,null,128,[],188,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,276,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,279,[]],
 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,277,[],23,[]],
+return a^a>>>6},"call$2","uN",4,0,null,280,[],23,[]],
 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","Hj",2,0,null,277,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,280,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,597,18,[],123,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,18,[],186,[],123,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,600,18,[],128,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,18,[],191,[],128,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
 $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","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22163,7 +22240,7 @@
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22173,7 +22250,7 @@
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22186,7 +22263,7 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22197,7 +22274,7 @@
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
@@ -22207,7 +22284,7 @@
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22220,7 +22297,7 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22234,7 +22311,7 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22248,7 +22325,7 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22261,7 +22338,7 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22274,7 +22351,7 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gBu",2,0,null,274,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
 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
@@ -22287,8 +22364,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:343;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,598,[],599,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,601,[],602,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -22297,7 +22374,7 @@
 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 "+b+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gXO",0,4,null,77,77,600,[],23,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gXO",0,4,null,77,77,603,[],23,[]],
 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],
@@ -22315,7 +22392,7 @@
 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","gHr",4,0,null,126,[],601,[]],
+return a},"call$2","gHr",4,0,null,131,[],604,[]],
 qL:[function(a,b){var z,y
 if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
 this.Sk.toString
@@ -22326,7 +22403,7 @@
 if(z){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,126,[],127,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,131,[],132,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -22337,7 +22414,7 @@
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
 this.Sk.toString
-return new U.uk(x,a,y)},"call$1","gvB",2,0,null,126,[]],
+return new U.uk(x,a,y)},"call$1","gvB",2,0,null,131,[]],
 Dl:[function(){var z,y,x,w
 if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -22427,34 +22504,34 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},"call$0","gRa",0,0,null],
-pT:[function(a){var z,y
+return y},"call$0","gJ1",0,0,null],
+pT0:[function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
 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,602,[]],
+return y},function(){return this.pT0("")},"Ud","call$1",null,"gwo",0,2,null,333,605,[]],
 Fj:[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.Fj("")},"tw","call$1",null,"gSE",0,2,null,330,602,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.Fj("")},"tw","call$1",null,"gSE",0,2,null,333,605,[]]}}],["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,278,109,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,281,114,[]],
 Ae:{
-"^":"a;vH>-484,P>-603",
+"^":"a;vH>-386,P>-606",
 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,225,91,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,491,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,367,"toString"],
+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,107,91,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,371,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,370,"toString"],
 $isAe:true,
 "@":function(){return[C.nJ]},
 "<>":[3],
-static:{iz:[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:"GR",args:[J.im,a]}},this.$receiver,"Ae")},47,[],23,[],"new IndexedValue"]}},
+static:{iz:[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")},47,[],23,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -22475,7 +22552,7 @@
 $asmW:function(a){return[[K.Ae,a]]},
 $ascX:function(a){return[[K.Ae,a]]}},
 vR:{
-"^":"Yl;WS,wX,CD",
+"^":"AC;WS,wX,CD",
 gl:function(){return this.CD},
 G:[function(){var z,y
 z=this.WS
@@ -22484,21 +22561,21 @@
 this.CD=H.VM(new K.Ae(y,z.gl()),[null])
 return!0}this.CD=null
 return!1},"call$0","gqy",0,0,null],
-$asYl:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
+$asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
 y1:[function(a,b){var z,y,x
 if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
 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","tm",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","tm",4,0,null,282,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 aK:[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","aN",2,0,null,280,[]],
+default:return a}},"call$1","aN",2,0,null,283,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22604,30 +22681,30 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,604,86,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,607,86,[]]},
 cfS:{
 "^":"fr;",
 W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,18,[]],
 LT:[function(a){a.wz.RR(0,this)
 this.xn(a)},"call$1","gff",2,0,null,18,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,390,[]],
+this.xn(a)},"call$1","gEW",2,0,null,441,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,390,[]],
+this.xn(a)},"call$1","gA2",2,0,null,441,[]],
 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,390,[]],
-ti:[function(a){return this.xn(a)},"call$1","gXj",2,0,null,276,[]],
+this.xn(a)},"call$1","gES",2,0,null,441,[]],
+ti:[function(a){return this.xn(a)},"call$1","gXj",2,0,null,279,[]],
 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","gX7",2,0,null,276,[]],
+this.xn(a)},"call$1","gX7",2,0,null,279,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","gvO",2,0,null,18,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,390,[]],
+this.xn(a)},"call$1","ghH",2,0,null,18,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,441,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
 this.xn(a)},"call$1","glf",2,0,null,91,[]],
@@ -22635,10 +22712,12 @@
 this.xn(a)},"call$1","ghe",2,0,null,91,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gXf",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/observatory_elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gXf",2,0,null,283,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["uL;hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["V0;kW%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+guw:[function(a){return a.kW},null,null,1,0,408,"app",355,397],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,551,23,[],"app",355],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22651,23 +22730,24 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.G6(a)
-return a},null,null,0,0,108,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[483]}],["script_ref_element","package:observatory/src/observatory_elements/script_ref.dart",,A,{
+return a},null,null,0,0,113,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[608],
+V0:{
+"^":"uL+Pi;",
+$isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-484,AP,fn,tY-349,Pe-360,m0-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRd:[function(a){return a.zw},null,null,1,0,491,"line",353,354],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,392,23,[],"line",353],
-gO3:[function(a){var z
-if(a.hm!=null&&a.tY!=null){z=this.Mq(a,J.UQ(a.tY,"id"))
-if(J.u6(a.zw,0))return z
-else return z+"?line="+H.d(a.zw)}return""},null,null,1,0,367,"url"],
+"^":["T5;zw%-386,AP,fn,tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRd:[function(a){return a.zw},null,null,1,0,371,"line",355,397],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,372,23,[],"line",355],
+grp:[function(a){if(J.u6(a.zw,0))return Q.xI.prototype.grp.call(this,a)
+return H.d(Q.xI.prototype.grp.call(this,a))+"?line="+H.d(a.zw)},null,null,1,0,370,"objectId"],
 gJp:[function(a){var z,y
 if(a.tY==null)return""
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return J.UQ(y,"user_name")
-else return H.d(J.UQ(y,"user_name"))+":"+H.d(a.zw)},null,null,1,0,367,"hoverText"],
+else return H.d(J.UQ(y,"user_name"))+":"+H.d(a.zw)},null,null,1,0,370,"hoverText"],
 goc:[function(a){var z,y,x
 z=a.tY
 if(z==null)return""
@@ -22675,8 +22755,8 @@
 z=J.U6(y)
 x=z.yn(y,J.WB(z.cn(y,"/"),1))
 if(J.u6(a.zw,0))return x
-else return x+":"+H.d(a.zw)},null,null,1,0,367,"name"],
-"@":function(){return[C.Ur]},
+else return x+":"+H.d(a.zw)},null,null,1,0,370,"name"],
+"@":function(){return[C.h9]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22685,31 +22765,25 @@
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.zw=-1
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.c0.ZL(a)
 C.c0.G6(a)
-return a},null,null,0,0,108,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[605],
+return a},null,null,0,0,113,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[609],
 T5:{
 "^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/observatory_elements/script_view.dart",,U,{
+$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V19;Uz%-606,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gNl:[function(a){return a.Uz},null,null,1,0,607,"script",353,354],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,608,23,[],"script",353],
+"^":["oaa;Uz%-610,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gNl:[function(a){return a.Uz},null,null,1,0,611,"script",355,397],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,612,23,[],"script",355],
 PQ:[function(a,b){if(J.de(b.gu9(),-1))return"min-width:32px;"
 else if(J.de(b.gu9(),0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,609,176,[],"hitsStyle"],
-wH:[function(a,b,c,d){var z,y,x
-z=a.hm.gZ6().R6()
-y=a.hm.gnI().AQ(z)
-if(y==null){N.Jx("").To("No isolate found.")
-return}x="/"+z+"/coverage"
-a.hm.gDF().fB(x).ml(new U.qq(a,y)).OA(new U.FC())},"call$3","gWp",6,0,374,18,[],303,[],74,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,613,181,[],"hitsStyle"],
+wH:[function(a,b,c,d){a.pC.oX("coverage").ml(new U.qq(a)).OA(new U.FC())},"call$3","gWp",6,0,425,18,[],306,[],74,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22722,45 +22796,45 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.G6(a)
-return a},null,null,0,0,108,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[610],
-V19:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[614],
+oaa:{
+"^":"PO+Pi;",
 $isd3:true},
 qq:{
-"^":"Tp:355;a-77,b-77",
+"^":"Tp:357;a-77",
 call$1:[function(a){var z,y
-this.b.oe(J.UQ(a,"coverage"))
 z=this.a
 y=J.RE(z)
-y.ct(z,C.YH,"",y.gXa(z))},"call$1",null,2,0,355,611,[],"call"],
+y.gpC(z).oe(J.UQ(a,"coverage"))
+y.ct(z,C.YH,"",y.gXa(z))},"call$1",null,2,0,357,615,[],"call"],
 $isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[358],
+"+ScriptViewElement_refreshCoverage_closure":[415],
 FC:{
-"^":"Tp:343;",
-call$2:[function(a,b){P.JS("refreshCoverage "+H.d(a)+" "+H.d(b))},"call$2",null,4,0,343,18,[],478,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){P.JS("refreshCoverage "+H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
 $isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[358]}],["service_ref_element","package:observatory/src/observatory_elements/service_ref.dart",,Q,{
+"+ScriptViewElement_refreshCoverage_closure":[415]}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Ds;tY%-349,Pe%-360,m0%-361,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gnv:[function(a){return a.tY},null,null,1,0,352,"ref",353,354],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,355,23,[],"ref",353],
-gjT:[function(a){return a.Pe},null,null,1,0,371,"internal",353,354],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,372,23,[],"internal",353],
-gAq:[function(a){return a.m0},null,null,1,0,502,"isolate",353,354],
-sAq:[function(a,b){a.m0=this.ct(a,C.Z8,a.m0,b)},null,null,3,0,503,23,[],"isolate",353],
+"^":["Sq;tY%-410,Pe%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gnv:[function(a){return a.tY},null,null,1,0,354,"ref",355,397],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,357,23,[],"ref",355],
+gjT:[function(a){return a.Pe},null,null,1,0,380,"internal",355,397],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,381,23,[],"internal",355],
 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.gJp(a))},"call$1","gma",2,0,153,227,[],"refChanged"],
-gO3:[function(a){var z=a.tY
-if(z!=null)return this.Mq(a,J.UQ(z,"id"))
-return""},null,null,1,0,367,"url"],
+this.ct(a,C.bA,"",this.gJp(a))},"call$1","gma",2,0,158,233,[],"refChanged"],
+gO3:[function(a){var z=a.pC
+if(z==null||a.tY==null)return""
+return z.rn(this.grp(a))},null,null,1,0,370,"url"],
+grp:[function(a){var z=a.tY
+return z==null?"":J.UQ(z,"id")},null,null,1,0,370,"objectId"],
 gJp:[function(a){var z,y
 z=a.tY
 if(z==null)return""
 y=J.UQ(z,"name")
-return y!=null?y:""},null,null,1,0,367,"hoverText"],
+return y!=null?y:""},null,null,1,0,370,"hoverText"],
 goc:[function(a){var z,y
 z=a.tY
 if(z==null)return"NULL REF"
@@ -22768,13 +22842,8 @@
 if(J.UQ(z,y)!=null)return J.UQ(a.tY,y)
 else if(J.UQ(a.tY,"name")!=null)return J.UQ(a.tY,"name")
 else if(J.UQ(a.tY,"user_name")!=null)return J.UQ(a.tY,"user_name")
-return""},null,null,1,0,367,"name"],
-vD:[function(a,b){this.ct(a,C.bD,0,1)},"call$1","gQ1",2,0,153,227,[],"isolateChanged"],
-Mq:[function(a,b){var z=a.hm
-if(z==null)return""
-else if(a.m0==null)return z.gZ6().kP(b)
-else return J.uY(z.gZ6(),J.F8(a.m0),b)},"call$1","gLc",2,0,534,612,[],"relativeLink",370],
-"@":function(){return[C.JD]},
+return""},null,null,1,0,370,"name"],
+"@":function(){return[C.Ldf]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22782,22 +22851,21 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.m0=null
 a.SO=z
 a.B7=y
 a.X0=w
 C.wU.ZL(a)
 C.wU.G6(a)
-return a},null,null,0,0,108,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[613],
-Ds:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_frame_element","package:observatory/src/observatory_elements/stack_frame.dart",,K,{
+return a},null,null,0,0,113,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[616],
+Sq:{
+"^":"PO+Pi;",
+$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["V20;Va%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gz1:[function(a){return a.Va},null,null,1,0,352,"frame",353,354],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,355,23,[],"frame",353],
+"^":["q2;Va%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gz1:[function(a){return a.Va},null,null,1,0,354,"frame",355,397],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,357,23,[],"frame",355],
 "@":function(){return[C.pE]},
 static:{an:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
@@ -22813,19 +22881,18 @@
 a.X0=v
 C.dX.ZL(a)
 C.dX.G6(a)
-return a},null,null,0,0,108,"new StackFrameElement$created"]}},
-"+StackFrameElement":[614],
-V20:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/observatory_elements/stack_trace.dart",,X,{
+return a},null,null,0,0,113,"new StackFrameElement$created"]}},
+"+StackFrameElement":[617],
+q2:{
+"^":"PO+Pi;",
+$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
-Vu:{
-"^":["V21;V4%-349,AP,fn,hm-350,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-351",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtN:[function(a){return a.V4},null,null,1,0,352,"trace",353,354],
-stN:[function(a,b){a.V4=this.ct(a,C.kw,a.V4,b)},null,null,3,0,355,23,[],"trace",353],
-RF:[function(a,b){var z=a.hm.gZ6().kP("stacktrace")
-a.hm.gDF().fB(z).ml(new X.At(a)).OA(new X.Sb()).YM(b)},"call$1","gvC",2,0,153,356,[],"refresh"],
-"@":function(){return[C.js]},
+uwf:{
+"^":["q3;Up%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gtN:[function(a){return a.Up},null,null,1,0,354,"trace",355,397],
+stN:[function(a,b){a.Up=this.ct(a,C.kw,a.Up,b)},null,null,3,0,357,23,[],"trace",355],
+RF:[function(a,b){a.pC.oX("stacktrace").ml(new X.At(a)).OA(new X.Sb()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+"@":function(){return[C.Yi]},
 static:{bV:[function(a){var z,y,x,w,v
 z=H.B7([],P.L5(null,null,null,null,null))
 z=R.Jk(z)
@@ -22834,36 +22901,36 @@
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.V4=z
+a.Up=z
 a.SO=y
 a.B7=x
 a.X0=v
 C.bg.ZL(a)
 C.bg.G6(a)
-return a},null,null,0,0,108,"new StackTraceElement$created"]}},
-"+StackTraceElement":[615],
-V21:{
-"^":"uL+Pi;",
+return a},null,null,0,0,113,"new StackTraceElement$created"]}},
+"+StackTraceElement":[618],
+q3:{
+"^":"PO+Pi;",
 $isd3:true},
 At:{
-"^":"Tp:225;a-77",
+"^":"Tp:107;a-77",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sV4(z,y.ct(z,C.kw,y.gV4(z),a))},"call$1",null,2,0,225,144,[],"call"],
+y.sUp(z,y.ct(z,C.kw,y.gUp(z),a))},"call$1",null,2,0,107,149,[],"call"],
 $isEH:true},
-"+StackTraceElement_refresh_closure":[358],
+"+StackTraceElement_refresh_closure":[415],
 Sb:{
-"^":"Tp:343;",
-call$2:[function(a,b){N.Jx("").hh("Error while reloading stack trace: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,343,18,[],359,[],"call"],
+"^":"Tp:346;",
+call$2:[function(a,b){N.Jx("").hh("Error while reloading stack trace: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
 $isEH:true},
-"+StackTraceElement_refresh_closure":[358]}],["template_binding","package:template_binding/template_binding.dart",,M,{
+"+StackTraceElement_refresh_closure":[415]}],["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)
 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,124,[]],
+default:return z.gLm(a)}},"call$1","nc",2,0,null,129,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
@@ -22875,7 +22942,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.XI(z,u,w,t)},"call$2","Nc",4,0,null,261,[],281,[]],
+return new M.XI(z,u,w,t)},"call$2","Nc",4,0,null,264,[],284,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -22885,16 +22952,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,261,[],144,[],282,[],281,[],283,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,264,[],149,[],285,[],284,[],286,[]],
 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,261,[]],
+return},"call$1","ay",2,0,null,264,[]],
 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,261,[],281,[]],
+if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,264,[],284,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -22905,7 +22972,7 @@
 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,124,[],281,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,129,[],284,[]],
 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.$ishs,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
@@ -22935,7 +23002,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,77,288,[],261,[],282,[],283,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,77,291,[],264,[],285,[],286,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -22953,13 +23020,13 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","jF",8,0,null,86,[],12,[],261,[],281,[]],
+return z},"call$4","tE",8,0,null,86,[],12,[],264,[],284,[]],
 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","KQ",4,0,null,202,[],282,[]],
+z=z.nextSibling}},"call$2","St",4,0,null,209,[],285,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -22974,12 +23041,12 @@
 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.hs(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,261,[]],
+return x},"call$1","La",2,0,null,264,[]],
 wR:[function(a){var z=J.RE(a)
 if(typeof a==="object"&&a!==null&&!!z.$iscv)if(z.gqn(a)!=="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,289,[]],
+return z},"call$1","xS",2,0,null,292,[]],
 V2:{
 "^":"hs;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
@@ -23000,10 +23067,10 @@
 if(w){J.Vs(y).Rz(0,b)
 v=z.Nj(b,0,J.xH(z.gB(b),1))}else v=b
 z=d!=null?d:""
-x=new M.D8(w,y,c,null,null,v,z)
+x=new M.BT(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,77,12,[],282,[],262,[]]},
-D8:{
+return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
+BT:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
@@ -23024,14 +23091,14 @@
 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,228,[]]},
+if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,234,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null]},
-YJ:{
-"^":"Tp:108;",
+DO:{
+"^":"Tp:113;",
 call$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -23048,25 +23115,25 @@
 return x.length===1?C.mt:C.Nm.gtH(x)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:225;b",
+"^":"Tp:107;b",
 call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,18,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,228,[]],
+J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,153,18,[]]},
+O.Y3()},"call$1","gqf",2,0,158,18,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,228,[]],
+J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,234,[]],
 FC:[function(a){var z,y,x,w
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
@@ -23075,7 +23142,7 @@
 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.$ishs?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,153,18,[]],
+if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,158,18,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23084,9 +23151,9 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,124,[]]}},
+return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,129,[]]}},
 r0:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -23095,12 +23162,12 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,285,[],"call"],
+return z},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:225;b",
+"^":"Tp:107;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,285,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
@@ -23109,7 +23176,7 @@
 if(this.Gh(a)===!0)return
 z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
 C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},"call$1","gH0",2,0,null,228,[]],
+this.Dh=z},"call$1","gH0",2,0,null,234,[]],
 Gh:[function(a){var z,y,x
 z=this.eS
 y=J.x(z)
@@ -23118,7 +23185,7 @@
 z=J.m4(X.TR.prototype.gH.call(this))
 return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,228,[]],
+return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,234,[]],
 C7:[function(){var z=this.Dh
 if(z!=null){z.disconnect()
 this.Dh=null}},"call$0","gln",0,0,null],
@@ -23128,18 +23195,18 @@
 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,153,18,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,158,18,[]],
 $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,23,[]]}},
 hB:{
-"^":"Tp:343;a",
+"^":"Tp:346;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,21,[],616,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,21,[],619,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:225;",
-call$1:[function(a){return 0},"call$1",null,2,0,null,237,[],"call"],
+"^":"Tp:107;",
+call$1:[function(a){return 0},"call$1",null,2,0,null,108,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -23163,7 +23230,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,77,12,[],282,[],262,[]]},
+return z},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
 XI:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 hs:{
@@ -23173,7 +23240,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,77,12,[],282,[],262,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23210,9 +23277,9 @@
 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,77,12,[],282,[],262,[]]},
+return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
 DT:{
-"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
+"^":"V2;lr,xT?,kr<,Dsl,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
 glN:function(){var z,y
 z=this.N1
@@ -23243,7 +23310,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,77,12,[],282,[],262,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23273,7 +23340,7 @@
 return}},"call$1","gC8",2,0,null,12,[]],
 jq:[function(){var z=this.kr
 if(!z.t9){z.t9=!0
-P.rb(z.gjM())}},"call$0","gvj",0,0,null],
+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)
@@ -23290,7 +23357,7 @@
 y=u}t=M.Fz(x,y)
 M.HP(t,w,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,77,77,77,282,[],281,[],283,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,77,77,77,285,[],284,[],286,[]],
 gzH:function(){return this.xT},
 gnv:function(a){var z,y,x,w,v
 this.Sy()
@@ -23329,7 +23396,7 @@
 if(a!=null)v.sQO(a)
 else if(w)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,77,617,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,77,620,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
@@ -23339,13 +23406,13 @@
 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","Tkw",4,0,null,261,[],284,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","Tkw",4,0,null,264,[],287,[]],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,258,[]],pZ:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,261,[]],pZ:[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)
@@ -23360,27 +23427,27 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","fo",2,0,null,285,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","fo",2,0,null,288,[]],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,258,[],285,[],286,[]],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,261,[],288,[],289,[]],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,287,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,290,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 z.textContent=$.cz()+" { display: none; }"
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:153;",
+"^":"Tp:158;",
 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.$ishs?a:M.Ky(a)))}},"call$1",null,2,0,null,258,[],"call"],
+M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a)))}},"call$1",null,2,0,null,261,[],"call"],
 $isEH:true},
-DO:{
-"^":"Tp:225;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,427,[],"call"],
+lP:{
+"^":"Tp:107;",
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,402,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -23399,7 +23466,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:343;a,b,c,d",
+"^":"Tp:346;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
@@ -23430,7 +23497,7 @@
 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,618,23,[]],
+return y+H.d(z[3])},"call$1","gBg",2,0,621,23,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -23441,7 +23508,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,619,620,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,622,623,[]],
 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",
@@ -23462,7 +23529,7 @@
 u=this.eD
 v.push(L.ao(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.VU(this))
-this.Az(w.gP(w))},"call$0","gjM",0,0,108],
+this.Az(w.gP(w))},"call$0","gjM",0,0,113],
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
@@ -23475,7 +23542,7 @@
 x=this.xG
 x=x!=null?x:[]
 w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},"call$1","ghC",2,0,null,228,[]],
+if(w.length!==0)this.El(w)},"call$1","gbe",2,0,null,234,[]],
 wx:[function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.e9.N1
@@ -23501,7 +23568,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,47,[],202,[],621,[],283,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,47,[],209,[],624,[],286,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23518,7 +23585,7 @@
 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,47,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gLu",2,0,null,47,[]],
 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
@@ -23544,9 +23611,9 @@
 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,622,252,[]],
+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,625,255,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,283,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,286,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23561,21 +23628,21 @@
 this.FS=null}this.e9.kr=null
 this.pq=!0},"call$0","gJK",0,0,null]},
 ts:{
-"^":"Tp:225;",
+"^":"Tp:107;",
 call$1:[function(a){return[a]},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:493;a",
+"^":"Tp:536;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,620,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,623,[],"call"],
 $isEH:true},
 VU:{
-"^":"Tp:225;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,373,[],"call"],
+"^":"Tp:107;b",
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,424,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -23591,11 +23658,11 @@
 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,77,12,[],282,[],262,[]]},
+return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,228,[]]},
+J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]]},
 wl:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -23612,9 +23679,9 @@
 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,77,12,[],282,[],262,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-ve:{
+T4:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
 "^":"",
 TR:{
@@ -23642,43 +23709,65 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:225;a",
+"^":"Tp:107;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,373,[],"call"],
-$isEH:true}}],])
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,424,[],"call"],
+$isEH:true}}],["vm_element","package:observatory/src/elements/vm_element.dart",,R,{
+"^":"",
+Zt:{
+"^":["Dsd;Jh%-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gzf:[function(a){return a.Jh},null,null,1,0,626,"vm",355,397],
+szf:[function(a,b){a.Jh=this.ct(a,C.DD,a.Jh,b)},null,null,3,0,627,23,[],"vm",355],
+"@":function(){return[C.rm]},
+static:{xip:[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.Qh.ZL(a)
+C.Qh.G6(a)
+return a},null,null,0,0,113,"new VMElement$created"]}},
+"+VMElement":[628],
+Dsd:{
+"^":"uL+Pi;",
+$isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
+J.O.$isRz=true
+J.O.$asRz=[J.O]
 J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
+J.P.$isRz=true
+J.P.$asRz=[J.P]
 J.P.$isa=true
 J.im.$isint=true
-J.im.$isTx=true
-J.im.$asTx=[J.P]
-J.im.$isTx=true
-J.im.$asTx=[J.P]
-J.im.$isTx=true
-J.im.$asTx=[J.P]
+J.im.$isRz=true
+J.im.$asRz=[J.P]
+J.im.$isRz=true
+J.im.$asRz=[J.P]
+J.im.$isRz=true
+J.im.$asRz=[J.P]
 J.im.$isa=true
 J.GW.$isdouble=true
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
+J.GW.$isRz=true
+J.GW.$asRz=[J.P]
+J.GW.$isRz=true
+J.GW.$asRz=[J.P]
 J.GW.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
 W.M5.$isa=true
-N.qV.$isTx=true
-N.qV.$asTx=[N.qV]
+N.qV.$isRz=true
+N.qV.$asRz=[N.qV]
 N.qV.$isa=true
 P.a6.$isa6=true
-P.a6.$isTx=true
-P.a6.$asTx=[P.a6]
+P.a6.$isRz=true
+P.a6.$asRz=[P.a6]
 P.a6.$isa=true
 P.Od.$isa=true
 J.Q.$isList=true
@@ -23763,17 +23852,17 @@
 P.Ys.$isej=true
 P.Ys.$isa=true
 X.TR.$isa=true
+F.d3.$isa=true
 T.z2.$isz2=true
 T.z2.$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
 P.qh.$isa=true
-W.Oq.$isea=true
-W.Oq.$isa=true
+W.CX.$isea=true
+W.CX.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -23786,7 +23875,7 @@
 A.zs.$isD0=true
 A.zs.$isa=true
 A.bS.$isa=true
-L.Y2.$isa=true
+G.Y2.$isa=true
 P.uq.$isa=true
 P.iD.$isiD=true
 P.iD.$isa=true
@@ -23801,18 +23890,17 @@
 W.I0.$isKV=true
 W.I0.$isD0=true
 W.I0.$isa=true
-W.DD.$isea=true
-W.DD.$isa=true
-L.bv.$isa=true
+W.Hy.$isea=true
+W.Hy.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
-L.c2.$isc2=true
-L.c2.$isa=true
-L.kx.$iskx=true
-L.kx.$isa=true
-L.rj.$isa=true
+G.kx.$iskx=true
+G.kx.$isa=true
+G.rj.$isa=true
+G.c2.$isc2=true
+G.c2.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -23843,14 +23931,14 @@
 P.JB.$isa=true
 P.Z0.$isZ0=true
 P.Z0.$isa=true
-L.Vi.$isVi=true
-L.Vi.$isa=true
+G.Vi.$isVi=true
+G.Vi.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
 W.D0.$isD0=true
 W.D0.$isa=true
-P.Tx.$isTx=true
-P.Tx.$isa=true
+P.Rz.$isRz=true
+P.Rz.$isa=true
 P.aY.$isaY=true
 P.aY.$isa=true
 P.lO.$islO=true
@@ -23860,8 +23948,8 @@
 P.nP.$isnP=true
 P.nP.$isa=true
 P.iP.$isiP=true
-P.iP.$isTx=true
-P.iP.$asTx=[null]
+P.iP.$isRz=true
+P.iP.$asRz=[null]
 P.iP.$isa=true
 P.ti.$isti=true
 P.ti.$isa=true
@@ -23915,6 +24003,7 @@
 J.CC=function(a){return J.RE(a).gmH(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.Co=function(a){return J.RE(a).gcC(a)}
+J.D8=function(a,b){return J.rY(a).yn(a,b)}
 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)}
@@ -23938,6 +24027,7 @@
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
+J.JD=function(a,b){return J.RE(a).R3(a,b)}
 J.Jj=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
@@ -23997,7 +24087,6 @@
 J.Z7=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
 J.ZP=function(a,b){return J.RE(a).Tk(a,b)}
-J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
 J.ak=function(a){return J.RE(a).gNF(a)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
@@ -24015,7 +24104,6 @@
 return J.x(a).n(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.eJ=function(a,b){return J.U6(a).cn(a,b)}
-J.eh=function(a,b){return J.RE(a).Ne(a,b)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.hf=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
@@ -24059,7 +24147,6 @@
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
-J.uY=function(a,b,c){return J.RE(a).r4(a,b,c)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
@@ -24089,7 +24176,7 @@
 C.x0=new J.Jh()
 C.oD=new J.P()
 C.Kn=new J.O()
-C.mI=new K.ndx()
+C.mI=new K.nd()
 C.Us=new A.yL()
 C.nJ=new K.vly()
 C.Wj=new P.JF()
@@ -24099,11 +24186,11 @@
 C.xE=A.wM.prototype
 C.YZ=Q.Tg.prototype
 C.kk=Z.Ps.prototype
-C.WA=new L.WAE("Collected")
-C.l8=new L.WAE("Dart")
-C.nj=new L.WAE("Native")
+C.WA=new G.WAE("Collected")
+C.l8=new G.WAE("Dart")
+C.nj=new G.WAE("Native")
 C.IK=O.CN.prototype
-C.YD=F.vc.prototype
+C.YD=F.HT.prototype
 C.j8=R.E0.prototype
 C.O0=R.lw.prototype
 C.Vy=new A.V3("disassembly-entry")
@@ -24123,16 +24210,17 @@
 C.Gg=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
 C.rc=new A.V3("message-viewer")
+C.rm=new A.V3("vm-element")
 C.NT=new A.V3("top-nav-menu")
-C.js=new A.V3("stack-trace")
-C.Ur=new A.V3("script-ref")
+C.Yi=new A.V3("stack-trace")
+C.h9=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
-C.jFV=new A.V3("isolate-list")
+C.jF=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")
 C.pE=new A.V3("stack-frame")
-C.y2=new A.V3("observatory-application")
+C.kR=new A.V3("observatory-application")
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
@@ -24140,8 +24228,9 @@
 C.KH=new A.V3("json-view")
 C.YQ=new A.V3("function-ref")
 C.QU=new A.V3("library-ref")
-C.Tq=new A.V3("field-view")
-C.JD=new A.V3("service-ref")
+C.EA=new A.V3("isolate-element")
+C.vc=new A.V3("field-view")
+C.Ldf=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
 C.be=new A.V3("instance-view")
@@ -24149,24 +24238,25 @@
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
 C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Oq])
+C.pi=H.VM(new W.e0("click"),[W.CX])
 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.ph=H.VM(new W.e0("message"),[W.DD])
+C.ph=H.VM(new W.e0("message"),[W.Hy])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
 C.Xo=U.AX.prototype
-C.Yu=N.yb.prototype
-C.Vc=K.NM.prototype
+C.h4=N.yb.prototype
+C.RJ=K.NM.prototype
 C.W3=W.zU.prototype
 C.cp=B.pR.prototype
 C.yK=Z.hx.prototype
+C.wx=S.PO.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
 C.XH=X.E7.prototype
-C.Qt=D.St.prototype
+C.Qt=D.Kz.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
 C.jn=J.im.prototype
@@ -24312,7 +24402,7 @@
 C.IF=new N.qV("INFO",800)
 C.cV=new N.qV("SEVERE",1000)
 C.UP=new N.qV("WARNING",900)
-C.S3=A.Zt.prototype
+C.S3=A.oM.prototype
 C.Z3=R.LU.prototype
 C.MG=M.T2.prototype
 I.makeConstantList = function(list) {
@@ -24322,7 +24412,6 @@
 };
 C.HE=I.makeConstantList([0,0,26624,1023,0,0,65534,2047])
 C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.makeConstantList([0,0,26498,1023,65534,34815,65534,18431])
 C.PQ=I.makeConstantList(["active","success","warning","danger","info"])
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
@@ -24339,8 +24428,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zJ)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 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.a5k=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.a5k)
 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"])
@@ -24349,8 +24438,8 @@
 C.S2=W.H9.prototype
 C.kD=A.F1.prototype
 C.SU=A.aQ.prototype
-C.nn=A.Qa.prototype
-C.J7=A.vI.prototype
+C.nn=A.Ya5.prototype
+C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
 C.k0=V.lI.prototype
 C.Pf=Z.uL.prototype
@@ -24361,7 +24450,7 @@
 C.cJ=U.fI.prototype
 C.wU=Q.xI.prototype
 C.dX=K.nm.prototype
-C.bg=X.Vu.prototype
+C.bg=X.uwf.prototype
 C.PU=new H.GD("dart.core.Object")
 C.N4=new H.GD("dart.core.DateTime")
 C.Ts=new H.GD("dart.core.bool")
@@ -24398,7 +24487,6 @@
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
-C.EN=new H.GD("id")
 C.fn=new H.GD("instance")
 C.i6=new H.GD("instruction")
 C.zD=new H.GD("internal")
@@ -24414,7 +24502,6 @@
 C.Cv=new H.GD("line")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.zu=new H.GD("members")
 C.US=new H.GD("messageType")
 C.fQ=new H.GD("methodCountSelected")
 C.UX=new H.GD("msg")
@@ -24423,15 +24510,15 @@
 C.OV=new H.GD("noSuchMethod")
 C.ap=new H.GD("oldHeapUsed")
 C.tI=new H.GD("percent")
-C.qb3=new H.GD("prefix")
 C.vb=new H.GD("profile")
 C.kY=new H.GD("ref")
+C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
-C.bD=new H.GD("relativeLink")
-C.wH=new H.GD("responses")
+C.mE=new H.GD("response")
 C.iF=new H.GD("rootLib")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
+C.XU=new H.GD("sampleCount")
 C.fX=new H.GD("script")
 C.Be=new H.GD("scriptRef")
 C.eC=new H.GD("[]=")
@@ -24446,6 +24533,7 @@
 C.ct=new H.GD("userName")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
+C.DD=new H.GD("vm")
 C.KS=new H.GD("vmName")
 C.z9=new H.GD("void")
 C.lx=A.tz.prototype
@@ -24463,17 +24551,16 @@
 C.z6Y=H.mm('Tg')
 C.eY=H.mm('n6')
 C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
 C.I5=H.mm('JG')
 C.z7=H.mm('G6')
-C.GTO=H.mm('F1')
+C.Ma=H.mm('F1')
 C.nY=H.mm('a')
 C.Yc=H.mm('iP')
 C.kA=H.mm('u7')
 C.PT=H.mm('I2')
 C.Wup=H.mm('LZ')
 C.P0k=H.mm('lI')
+C.Lz=H.mm('PO')
 C.T1=H.mm('Wy')
 C.hG=H.mm('ir')
 C.aj=H.mm('fI')
@@ -24482,9 +24569,12 @@
 C.G4=H.mm('CN')
 C.O4=H.mm('double')
 C.yw=H.mm('int')
+C.Mh=H.mm('Zt')
+C.Lf0=H.mm('uwf')
 C.RcY=H.mm('aQ')
 C.ld=H.mm('AX')
 C.yiu=H.mm('knI')
+C.oW=H.mm('Ya5')
 C.iN=H.mm('yc')
 C.HI=H.mm('Pg')
 C.ila=H.mm('xI')
@@ -24494,29 +24584,30 @@
 C.jV=H.mm('rF')
 C.JZ=H.mm('E7')
 C.wd=H.mm('vj')
-C.CTH=H.mm('St')
+C.JW=H.mm('Ww')
 C.Rg=H.mm('yb')
+C.wHJ=H.mm('Kz')
 C.cx5=H.mm('m8')
 C.l49=H.mm('uL')
 C.yQ=H.mm('EH')
 C.Im=H.mm('X6')
 C.GG=H.mm('PF')
 C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
+C.p5=H.mm('oM')
+C.yD=H.mm('E0')
 C.nG=H.mm('zt')
-C.Xb=H.mm('vc')
 C.yG=H.mm('nm')
-C.px=H.mm('tz')
+C.vA=H.mm('tz')
 C.ow=H.mm('E9')
 C.PV=H.mm('wM')
 C.Db=H.mm('String')
 C.EP=H.mm('NM')
-C.FsU=H.mm('vI')
 C.Bm=H.mm('XP')
 C.Tn=H.mm('T2')
 C.hg=H.mm('hd')
 C.dd=H.mm('pR')
 C.Ud8=H.mm('Ps')
+C.Io=H.mm('HT')
 C.HL=H.mm('bool')
 C.Qf=H.mm('Null')
 C.HH=H.mm('dynamic')
@@ -24525,11 +24616,11 @@
 C.CS=H.mm('vm')
 C.Hk=H.mm('Gk')
 C.hN=H.mm('oI')
-C.IWi=H.mm('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
+C.Qh=R.Zt.prototype
 C.ol=W.u9.prototype
-C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
+C.hi=H.VM(new W.hP(W.pq()),[W.OJ])
 $.libraries_to_load = {}
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
@@ -24543,6 +24634,7 @@
 $.nw=null
 $.vv=null
 $.Bv=null
+$.NR=null
 $.oK=null
 $.tY=null
 $.S6=null
@@ -24554,16 +24646,14 @@
 $.RL=!1
 $.Y4=C.IF
 $.xO=0
-$.NR=null
-$.tE=null
 $.el=0
 $.tW=null
 $.Td=!1
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["AZ","B2","BN","BT","BX","Ba","Bf","Bk","C","C0","C4","CL","Ch","D","D3","D6","Dd","De","Dy","E","Ec","F","FL","FV","Fr","G6","GB","GG","GT","HG","Hn","Hs","IW","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LV","LZ","M8","Md","Mi","Mq","Mu","NC","NZ","Ne","Nj","O","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qq","Qx","R3","R4","RB","RF","RP","RR","Rg","Rz","SF","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VI","VR","Vk","Vr","W","W3","W4","WL","WO","WZ","Wt","X6","XG","XL","XU","Xl","Y","Y9","YF","YU","YW","Z","Z1","Z2","ZB","ZL","Ze","Zv","aC","aN","aZ","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","f9","fk","fm","fz","g","gA","gAp","gAq","gAu","gAy","gB","gB1","gBA","gBW","gCO","gCY","gCd","gCj","gDD","gDt","gEh","gF0","gF8","gFR","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gGj","gHX","gHm","gHu","gI","gIF","gIt","gJ0","gJS","gJf","gJo","gJp","gKE","gKM","gKU","gKV","gLA","gLY","gLm","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNI","gNh","gNl","gO3","gO9","gOc","gOl","gP","gP1","gPe","gPj","gPu","gPw","gPy","gQ7","gQW","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUV","gUj","gUy","gUz","gV4","gVa","gVl","gW0","gWT","gX3","gXc","gXh","gXt","gZ8","gZC","gZf","ga4","gaK","gai","gbG","gbP","gbV","gbx","gcC","gcL","gdU","geJ","geT","geb","gey","gfN","gfY","gfb","gfc","ghU","ghf","ghm","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkc","gkf","gkp","gl0","gl7","glc","gm0","gm2","gmH","gmW","gmm","gng","gnv","gnx","goE","goc","gor","gpQ","gpo","gq3","gq6","gqO","gqY","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","guD","guw","gvH","gvL","gvR","gvc","gvt","gwd","gx8","gxX","gxj","gxr","gxw","gyH","gyT","gys","gz1","gzP","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","i","i4","iF","iM","ii","iw","j","jh","jp","jx","k0","kO","ka","l5","lj","m","mK","n","nB","nC","nH","ni","nq","nt","oB","oC","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qH","qZ","r4","r6","rJ","sAp","sAq","sAu","sAy","sB","sB1","sBA","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF8","sFR","sFw","sG1","sG3","sGQ","sGV","sGd","sGj","sHX","sHm","sHu","sIF","sIt","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLY","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNI","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUy","sUz","sV4","sVa","sWT","sX3","sXc","sXh","sXt","sZ8","sZC","sa4","saK","sai","sbG","sbP","sbV","scC","scL","sdU","seJ","seT","seb","sfN","sfY","sfb","sfc","shU","shf","shm","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skc","skf","skp","sl7","sm0","sm2","smH","sng","snv","snx","soE","soc","spQ","spo","sq3","sq6","sqO","sqY","srU","srZ","srs","st0","st5","stD","stN","stT","stY","suD","suw","svH","svL","svR","svt","swd","sxX","sxj","sxr","sxw","syH","syT","sys","sz1","szZ","szh","szj","szw","t","tZ","tg","tt","u","u8","uB","vD","w","wE","wH","wL","wR","wW","wY","wg","x3","xc","xe","xo","y0","yC","yF","yG","yM","yN","yc","ym","yn","yq","yu","yx","yy","z2","zV","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.I5,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.z5},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.Qw,E.Fv,{created:E.AH},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.v9},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.mR,A.fl,{created:A.Yt},C.JZ,X.E7,{created:X.jD},C.wd,Z.vj,{created:Z.mA},C.CTH,D.St,{created:D.JR},C.Rg,N.yb,{created:N.N0},C.cx5,D.m8,{created:D.Tt},C.l49,Z.uL,{created:Z.Hx},C.GG,L.PF,{created:L.A5},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.Xb,F.vc,{created:F.Fe},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.ow,F.E9,{created:F.TW},C.PV,A.wM,{created:A.lT},C.EP,K.NM,{created:K.op},C.FsU,A.vI,{created:A.ZC},C.Bm,A.XP,{created:A.XL},C.Tn,M.T2,{created:M.SP},C.hg,W.hd,{},C.dd,B.pR,{created:B.b4},C.Ud8,Z.Ps,{created:Z.zg},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.cY},C.IWi,X.Vu,{created:X.bV}]
+$.Dq=["AZ","B2","BN","BT","BX","Ba","Bf","Bk","C","C0","C4","CL","Ch","D","D3","D6","Dd","De","E","Ec","F","FL","FV","Fr","G6","GB","GG","GT","HG","Hn","Hs","IW","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LV","Md","Mi","Mu","NZ","Nj","O","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qq","Qx","R3","R4","RB","RF","RP","RR","Rg","Rz","SF","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VR","Vk","Vr","W","W3","W4","WL","WO","WZ","Wj","Wt","X6","XG","XL","XU","Xl","Y","Y9","YF","YU","YW","Yh","Z","Z1","Z2","ZB","ZL","ZZ","Ze","Zv","aC","aN","aZ","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","f9","fk","fm","fz","g","gA","gAp","gAq","gAu","gAy","gB","gB1","gBW","gCO","gCY","gCd","gCj","gDD","gDt","gEh","gF0","gFR","gG0","gG1","gG3","gGQ","gGV","gGd","gGj","gHX","gHm","gHu","gI","gIF","gIt","gJ0","gJS","gJf","gJh","gJo","gJp","gKE","gKM","gKV","gLA","gLW","gLY","gLm","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOc","gOl","gP","gP1","gPe","gPj","gPu","gPy","gQ7","gQW","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gSS","gTB","gTq","gUQ","gUV","gUj","gUo","gUp","gUy","gUz","gVa","gVl","gW0","gWT","gX3","gXc","gXh","gXt","gZ8","gZC","gZf","ga4","gaK","gah","gai","gbG","gbP","gbV","gbx","gcC","gcL","gdU","geH","geJ","geT","geb","gey","gfN","gfY","gfb","gfc","ghU","ghf","gi9","giC","giO","gig","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkX","gkc","gkf","gkg","gkp","gl0","gl7","gm0","gm2","gmH","gmW","gmm","gn9","gng","gnv","gnx","goE","goc","gor","gpC","gpD","gpQ","gpo","gq3","gq6","gqO","gqY","gqn","grK","grU","grZ","grp","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","guD","guw","guy","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxH","gxX","gxj","gxr","gxw","gyH","gyT","gys","gz1","gzP","gzZ","gzf","gzh","gzj","gzw","h","h8","hZ","hc","hr","i","i4","iF","iM","ii","iw","j","jh","jp","jx","k","k0","kO","ka","l5","lj","m","mK","n","nB","nC","nH","ni","np","nq","nt","oB","oC","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qH","qZ","r6","rJ","sAp","sAq","sAu","sAy","sB","sB1","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sFR","sG1","sG3","sGQ","sGV","sGd","sGj","sHX","sHm","sHu","sIF","sIt","sJ0","sJS","sJh","sJo","sKM","sKV","sLA","sLW","sLY","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPe","sPj","sPu","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sSS","sTB","sTq","sUQ","sUo","sUp","sUy","sUz","sVa","sWT","sX3","sXc","sXh","sXt","sZ8","sZC","sa4","saK","sah","sai","sbG","sbP","sbV","scC","scL","sdU","seH","seJ","seT","seb","sfN","sfY","sfb","sfc","shU","shf","siC","sig","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skX","skc","skf","skg","skp","sl7","sm0","sm2","smH","sn9","sng","snv","snx","soE","soc","spC","spD","spQ","spo","sq3","sq6","sqO","sqY","srU","srZ","srs","st0","st5","stD","stN","stT","stY","suD","suw","suy","svH","svL","svk","svt","swd","sxH","sxX","sxj","sxr","sxw","syH","syT","sys","sz1","szZ","szf","szh","szj","szw","t","tZ","tg","tt","u","u8","uB","uW","w","wE","wH","wL","wR","wW","wY","wg","x3","xc","xe","xo","y0","yC","yF","yM","yN","yc","yn","yq","yu","yx","yy","z2","zV","zr"]
+$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.I5,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.Lz,S.PO,{created:S.O5},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.Qw,E.Fv,{created:E.AH},C.G4,O.CN,{created:O.On},C.Mh,R.Zt,{created:R.xip},C.Lf0,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.wH},C.yiu,A.knI,{created:A.Th},C.oW,A.Ya5,{created:A.EL},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.mR,A.fl,{created:A.Yt},C.JZ,X.E7,{created:X.jD},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.Rg,N.yb,{created:N.N0},C.wHJ,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.Tt},C.l49,Z.uL,{created:Z.Hx},C.GG,L.PF,{created:L.A5},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.yD,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.vA,A.tz,{created:A.J8},C.ow,F.E9,{created:F.TW},C.PV,A.wM,{created:A.lT},C.EP,K.NM,{created:K.op},C.Bm,A.XP,{created:A.XL},C.Tn,M.T2,{created:M.SP},C.hg,W.hd,{},C.dd,B.pR,{created:B.b4},C.Ud8,Z.Ps,{created:Z.zg},C.Io,F.HT,{created:F.Fe},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.cY}]
 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})
@@ -24606,6 +24696,9 @@
     return e.message;
   }
 }())})
+I.$lazy($,"_codeMatcher","rC","Ks",function(){return new H.VR(H.v4("/code/",!1,!0,!1),null,null)})
+I.$lazy($,"_scriptMatcher","lF","hK",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
+I.$lazy($,"currentIsolateMatcher","qY","oy",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($,"validationPattern","zP","R0",function(){return new H.VR(H.v4("^(?:[a-zA-Z$][a-zA-Z$0-9_]*\\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|-|unary-|\\[\\]=|~|==|\\[\\]|\\*|/|%|~/|\\+|<<|>>|>=|>|<=|<|&|\\^|\\|)$",!1,!0,!1),null,null)})
@@ -24625,15 +24718,9 @@
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_loggers","DY","U0",function(){return H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,N.TJ])})
-I.$lazy($,"currentIsolateMatcher","qY","oy",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"currentIsolateProfileMatcher","HT","wf",function(){return new H.VR(H.v4("#/isolates/\\d+/profile",!1,!0,!1),null,null)})
-I.$lazy($,"_codeMatcher","zS","mE",function(){return new H.VR(H.v4("/isolates/\\d+/code/",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","yA","kj",function(){return new H.VR(H.v4("/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_scriptMatcher","c6","Ww",function(){return new H.VR(H.v4("/isolates/\\d+/scripts/.+",!1,!0,!1),null,null)})
-I.$lazy($,"_scriptPrefixMatcher","ZW","XJ",function(){return new H.VR(H.v4("/isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().call$0()})
+I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.YJ().call$0()})
 I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
@@ -24642,7 +24729,7 @@
 I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
 I.$lazy($,"_objectType","Cy","Tf",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w9().call$0()})
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w10().call$0()})
 I.$lazy($,"bindPattern","ZA","VC",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
 z.FV(0,C.va)
@@ -24660,16 +24747,16 @@
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
 I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().call$0()})
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.lP(),"-",new K.Uf(),"*",new K.Ra(),"/",new K.wJY(),"==",new K.zOQ(),"!=",new K.W6o(),">",new K.MdQ(),">=",new K.YJG(),"<",new K.DOe(),"<=",new K.lPa(),"||",new K.Ufa(),"&&",new K.Raa(),"|",new K.w0()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w4(),"-",new K.w5(),"!",new K.w7()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJ().call$0()})
+I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.Uf(),"-",new K.Ra(),"*",new K.wJY(),"/",new K.zOQ(),"==",new K.W6o(),"!=",new K.MdQ(),">",new K.YJG(),">=",new K.DOe(),"<",new K.lPa(),"<=",new K.Ufa(),"||",new K.Raa(),"&&",new K.w0(),"|",new K.w4()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w5(),"-",new K.w7(),"!",new K.w9()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().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])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.DO()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.lP()).zV(0,", ")})
 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","sender","e","msg","message","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:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","compare","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",!1,"futures","eagerError","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Vx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.e4,P.JB,null,P.MN]},"self","parent",{func:"aD",args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"zo",ret:P.lO,args:[P.JB,P.e4,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.e4,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.e4,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"Re",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","sb",{func:"xh",ret:J.im,args:[P.Tx,P.Tx]},"formattedString",{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}},"host","scheme","query","queryParameters","fragment","component","val","val1","val2",C.xM,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","onProgress","withCredentials","method","mimeType","requestHeaders","responseType","sendData","thing","win","constructor",{func:"Dv",args:[null]},{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total","_","id","members",{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","args","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.cX,K.Ae],args:[P.cX]},"classMirror","c","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","n","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","password","user","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","attributeFilter","attributeOldValue","attributes","characterData","characterDataOldValue","childList","subtree","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","collection","","separator",0,!0,"growable","fractionDigits","str","authentification","resume","portId","port","dataEvent","info",{func:"bh",args:[null,null]},"parameter","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",P.Z0,L.mL,[P.Z0,J.O,W.cv],{func:"qo",ret:P.Z0},C.nJ,C.Us,{func:"Hw",args:[P.Z0]},"done",B.Vf,H.Tp,"trace",J.kn,L.bv,Q.xI,Z.pv,L.kx,{func:"bR",ret:L.kx},{func:"oX",args:[L.kx]},{func:"I0",ret:J.O},F.Vfx,J.O,C.mI,{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.Nr,"action","test","library",{func:"h0",args:[H.Uz]},{func:"rm",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]},"theError","theStackTrace",{func:"rf",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","event","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:"Q5",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]},"digit",{func:"an",ret:J.im,args:[J.im]},"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",L.DP,{func:"JA",ret:L.DP},{func:"Qs",args:[L.DP]},E.tuj,F.Vct,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:"pw",void:true,args:[J.kn,null]},"expand",Z.cda,Z.uL,J.im,[J.Q,L.Y2],[J.Q,J.O],"codeCaller",{func:"UO",args:[L.Vi]},J.Q,L.XN,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},{func:"mR",args:[J.Q]},{func:"ub",void:true,args:[L.bv,J.im,P.Z0]},"totalSamples",{func:"F9",void:true,args:[L.bv]},{func:"bN",ret:J.O,args:[L.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.waa,"profile",{func:"Wy",ret:L.bv},{func:"Gt",args:[L.bv]},D.V0,Z.V4,M.V10,"logLevel","rec",{func:"IM",args:[N.HV]},{func:"cr",ret:[J.Q,P.Z0]},A.V11,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,L.dZ,L.Nu,L.yU,"label",[P.Z0,J.O,L.rj],[J.Q,L.kx],[P.Z0,J.O,J.GW],{func:"Ik",ret:L.CM},{func:"Ve",args:[L.CM]},"address","coverages","timer",[P.Z0,J.O,L.bv],"E",{func:"EU",ret:P.iD},{func:"Y4",args:[P.iD]},{func:"zs",ret:J.O,args:[J.O]},"scriptURL",{func:"jN",ret:J.O,args:[J.O,J.O]},"isolateId",{func:"fP",ret:J.GW},{func:"mV",args:[J.GW]},[J.Q,L.DP],"calls","codes","instructionList","profileCode",{func:"VL",args:[L.kx,L.kx]},[J.Q,L.c2],{func:"dt",ret:P.cX},"lineNumber","hits",{func:"ZD",args:[[J.Q,P.Z0]]},"responseString","requestString",{func:"Tz",void:true,args:[null,null]},"children","rowIndex",V.V18,{func:"AG",void:true,args:[J.O,J.O,J.O]},{func:"ru",ret:L.mL},{func:"pu",args:[L.mL]},{func:"nxg",ret:J.O,args:[J.GW]},"time","bytes",{func:"kX",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},Z.LP,{func:"Aa",args:[P.e4,P.JB]},{func:"TB",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"S5",ret:J.kn,args:[P.a]},{func:"D8",args:[[J.Q,G.DA]]},{func:"Gm",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rj",void:true,args:[J.O,J.O]},"preventCascade",{func:"KT",void:true,args:[[P.cX,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:"Nt",args:[U.hw]},A.T5,L.rj,{func:"LW",ret:L.rj},{func:"PF",args:[L.rj]},{func:"Yg",ret:J.O,args:[L.c2]},U.V19,"coverage","link",Q.Ds,K.V20,X.V21,"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]]},];$=null
+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","sender","e","msg","message","x","record","value","memberName",{func:"pd",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]},"_","objectId","id","members",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","compare","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",!1,"futures","eagerError","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Vx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.e4,P.JB,null,P.MN]},"self","parent",{func:"aD",args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"xN",ret:P.lO,args:[P.JB,P.e4,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.e4,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.e4,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"Re",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","sb","lead","tail",{func:"P2",ret:J.im,args:[P.Rz,P.Rz]},"formattedString",{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}},"host","scheme","query","queryParameters","fragment","component","val","val1","val2",C.xM,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","onProgress","withCredentials","method","mimeType","requestHeaders","responseType","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","args","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.cX,K.Ae],args:[P.cX]},"classMirror","c","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","n","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","password","user","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","attributeFilter","attributeOldValue","attributes","characterData","characterDataOldValue","childList","subtree","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","collection","","separator",0,!0,"growable","fractionDigits","str","authentification","resume","portId","port","dataEvent","info",{func:"bh",args:[null,null]},"parameter","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,G.No,{func:"qo",ret:P.Z0},C.nJ,C.mI,{func:"Hw",args:[P.Z0]},{func:"Wy",ret:G.bv},{func:"Gt",args:[G.bv]},"ResponseError","errorType","label","row",[P.Z0,J.O,G.rj],[J.Q,G.kx],[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},{func:"NA",ret:G.CM},{func:"Ve",args:[G.CM]},{func:"I0",ret:J.O},{func:"cH",ret:J.im},{func:"Z5",args:[J.im]},"address","coverages","modelName",{func:"Tz",void:true,args:[null,null]},"st","timer","response",{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},{func:"EU",ret:P.iD},{func:"Y4",args:[P.iD]},"event","so",J.im,J.O,{func:"fP",ret:J.GW},{func:"Ku",args:[J.GW]},[J.Q,G.Q4],"calls","codes","instructionList","profileCode",{func:"VL",args:[G.kx,G.kx]},[J.Q,G.c2],C.Us,{func:"dt",ret:P.cX},"lineNumber","hits",{func:"cM",void:true,args:[P.Z0]},"k",[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",V.qC,{func:"ru",ret:G.mL},"E",P.Z0,G.bv,[P.Z0,J.O,W.cv],"done",B.Ur,H.Tp,"trace",J.kn,Q.xI,Z.KU,G.kx,{func:"bR",ret:G.kx},{func:"VI",args:[G.kx]},F.qbd,"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Ds,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"rm",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:"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]},"theError","theStackTrace",{func:"rf",args:[P.a]},{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","elements","offset","comp","key1","key2",{func:"Q5",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:"hs",ret:J.kn,args:[J.im]},"digit",{func:"an",ret:J.im,args:[J.im]},"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",G.Q4,{func:"JA",ret:G.Q4},{func:"Qs",args:[G.Q4]},E.pv,F.Vfx,A.Urj,N.oub,{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.c4r,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.Squ,S.Vf,R.Zt,"codeCaller",{func:"SR",args:[G.Vi]},J.Q,G.XN,{func:"r5",ret:J.Q},{func:"mR",args:[J.Q]},{func:"ub",void:true,args:[G.bv,J.im,P.Z0]},"totalSamples",{func:"F9",void:true,args:[G.bv]},{func:"bN",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.KUl,"profile",S.PO,Z.tuj,M.mHk,"logLevel","rec",{func:"IM",args:[N.HV]},G.mL,{func:"pu",args:[G.mL]},L.Vct,Z.uL,A.D13,A.WZq,A.pva,A.cda,A.qFb,A.rna,A.Vba,V.waa,{func:"wA",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"pT",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.JB]},{func:"Zg",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"S5",ret:J.kn,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"D8",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rj",void:true,args:[J.O,J.O]},"preventCascade",{func:"KT",void:true,args:[[P.cX,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:"mM",args:[U.hw]},Q.V0,A.T5,G.rj,{func:"ls",ret:G.rj},{func:"PF",args:[G.rj]},{func:"Yg",ret:J.O,args:[G.c2]},U.oaa,"coverage",Q.Sq,K.q2,X.q3,"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:"Lr",ret:G.No},{func:"AfY",args:[G.No]},R.Dsd,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -24868,11 +24955,11 @@
 $desc=$collectedClasses.qE
 if($desc instanceof Array)$desc=$desc[1]
 qE.prototype=$desc
-function ho(){}ho.builtin$cls="ho"
-if(!"name" in ho)ho.name="ho"
-$desc=$collectedClasses.ho
+function pa(){}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
 if($desc instanceof Array)$desc=$desc[1]
-ho.prototype=$desc
+pa.prototype=$desc
 function Gh(){}Gh.builtin$cls="Gh"
 if(!"name" in Gh)Gh.name="Gh"
 $desc=$collectedClasses.Gh
@@ -24971,12 +25058,12 @@
 Zv.prototype=$desc
 Zv.prototype.gRn=function(receiver){return receiver.data}
 Zv.prototype.gB=function(receiver){return receiver.length}
-function QQS(){}QQS.builtin$cls="QQS"
-if(!"name" in QQS)QQS.name="QQS"
-$desc=$collectedClasses.QQS
+function Yr(){}Yr.builtin$cls="Yr"
+if(!"name" in Yr)Yr.name="Yr"
+$desc=$collectedClasses.Yr
 if($desc instanceof Array)$desc=$desc[1]
-QQS.prototype=$desc
-QQS.prototype.gtT=function(receiver){return receiver.code}
+Yr.prototype=$desc
+Yr.prototype.gtT=function(receiver){return receiver.code}
 function BR(){}BR.builtin$cls="BR"
 if(!"name" in BR)BR.name="BR"
 $desc=$collectedClasses.BR
@@ -25075,7 +25162,6 @@
 cv.prototype.gxr=function(receiver){return receiver.className}
 cv.prototype.sxr=function(receiver,v){return receiver.className=v}
 cv.prototype.gjO=function(receiver){return receiver.id}
-cv.prototype.sjO=function(receiver,v){return receiver.id=v}
 function Fs(){}Fs.builtin$cls="Fs"
 if(!"name" in Fs)Fs.name="Fs"
 $desc=$collectedClasses.Fs
@@ -25132,16 +25218,16 @@
 $desc=$collectedClasses.u5
 if($desc instanceof Array)$desc=$desc[1]
 u5.prototype=$desc
-function h4(){}h4.builtin$cls="h4"
-if(!"name" in h4)h4.name="h4"
-$desc=$collectedClasses.h4
+function Tq(){}Tq.builtin$cls="Tq"
+if(!"name" in Tq)Tq.name="Tq"
+$desc=$collectedClasses.Tq
 if($desc instanceof Array)$desc=$desc[1]
-h4.prototype=$desc
-h4.prototype.gB=function(receiver){return receiver.length}
-h4.prototype.gbP=function(receiver){return receiver.method}
-h4.prototype.goc=function(receiver){return receiver.name}
-h4.prototype.soc=function(receiver,v){return receiver.name=v}
-h4.prototype.gN=function(receiver){return receiver.target}
+Tq.prototype=$desc
+Tq.prototype.gB=function(receiver){return receiver.length}
+Tq.prototype.gbP=function(receiver){return receiver.method}
+Tq.prototype.goc=function(receiver){return receiver.name}
+Tq.prototype.soc=function(receiver,v){return receiver.name=v}
+Tq.prototype.gN=function(receiver){return receiver.target}
 function W4(){}W4.builtin$cls="W4"
 if(!"name" in W4)W4.name="W4"
 $desc=$collectedClasses.W4
@@ -25152,11 +25238,11 @@
 $desc=$collectedClasses.jP
 if($desc instanceof Array)$desc=$desc[1]
 jP.prototype=$desc
-function Hd(){}Hd.builtin$cls="Hd"
-if(!"name" in Hd)Hd.name="Hd"
-$desc=$collectedClasses.Hd
+function Cz(){}Cz.builtin$cls="Cz"
+if(!"name" in Cz)Cz.name="Cz"
+$desc=$collectedClasses.Cz
 if($desc instanceof Array)$desc=$desc[1]
-Hd.prototype=$desc
+Cz.prototype=$desc
 function tA(){}tA.builtin$cls="tA"
 if(!"name" in tA)tA.name="tA"
 $desc=$collectedClasses.tA
@@ -25349,11 +25435,11 @@
 $desc=$collectedClasses.ZY
 if($desc instanceof Array)$desc=$desc[1]
 ZY.prototype=$desc
-function DD(){}DD.builtin$cls="DD"
-if(!"name" in DD)DD.name="DD"
-$desc=$collectedClasses.DD
+function Hy(){}Hy.builtin$cls="Hy"
+if(!"name" in Hy)Hy.name="Hy"
+$desc=$collectedClasses.Hy
 if($desc instanceof Array)$desc=$desc[1]
-DD.prototype=$desc
+Hy.prototype=$desc
 function EeC(){}EeC.builtin$cls="EeC"
 if(!"name" in EeC)EeC.name="EeC"
 $desc=$collectedClasses.EeC
@@ -25369,11 +25455,11 @@
 Qb.prototype=$desc
 Qb.prototype.gP=function(receiver){return receiver.value}
 Qb.prototype.sP=function(receiver,v){return receiver.value=v}
-function PG(){}PG.builtin$cls="PG"
-if(!"name" in PG)PG.name="PG"
-$desc=$collectedClasses.PG
+function Vu(){}Vu.builtin$cls="Vu"
+if(!"name" in Vu)Vu.name="Vu"
+$desc=$collectedClasses.Vu
 if($desc instanceof Array)$desc=$desc[1]
-PG.prototype=$desc
+Vu.prototype=$desc
 function xe(){}xe.builtin$cls="xe"
 if(!"name" in xe)xe.name="xe"
 $desc=$collectedClasses.xe
@@ -25403,24 +25489,24 @@
 $desc=$collectedClasses.Ve
 if($desc instanceof Array)$desc=$desc[1]
 Ve.prototype=$desc
-function Oq(){}Oq.builtin$cls="Oq"
-if(!"name" in Oq)Oq.name="Oq"
-$desc=$collectedClasses.Oq
+function CX(){}CX.builtin$cls="CX"
+if(!"name" in CX)CX.name="CX"
+$desc=$collectedClasses.CX
 if($desc instanceof Array)$desc=$desc[1]
-Oq.prototype=$desc
+CX.prototype=$desc
 function H9(){}H9.builtin$cls="H9"
 if(!"name" in H9)H9.name="H9"
 $desc=$collectedClasses.H9
 if($desc instanceof Array)$desc=$desc[1]
 H9.prototype=$desc
-function o4(){}o4.builtin$cls="o4"
-if(!"name" in o4)o4.name="o4"
-$desc=$collectedClasses.o4
+function FI(){}FI.builtin$cls="FI"
+if(!"name" in FI)FI.name="FI"
+$desc=$collectedClasses.FI
 if($desc instanceof Array)$desc=$desc[1]
-o4.prototype=$desc
-o4.prototype.gjL=function(receiver){return receiver.oldValue}
-o4.prototype.gN=function(receiver){return receiver.target}
-o4.prototype.gt5=function(receiver){return receiver.type}
+FI.prototype=$desc
+FI.prototype.gjL=function(receiver){return receiver.oldValue}
+FI.prototype.gN=function(receiver){return receiver.target}
+FI.prototype.gt5=function(receiver){return receiver.type}
 function oU(){}oU.builtin$cls="oU"
 if(!"name" in oU)oU.name="oU"
 $desc=$collectedClasses.oU
@@ -25635,13 +25721,13 @@
 $desc=$collectedClasses.uaa
 if($desc instanceof Array)$desc=$desc[1]
 uaa.prototype=$desc
-function zD9(){}zD9.builtin$cls="zD9"
-if(!"name" in zD9)zD9.name="zD9"
-$desc=$collectedClasses.zD9
+function Hd(){}Hd.builtin$cls="Hd"
+if(!"name" in Hd)Hd.name="Hd"
+$desc=$collectedClasses.Hd
 if($desc instanceof Array)$desc=$desc[1]
-zD9.prototype=$desc
-zD9.prototype.gkc=function(receiver){return receiver.error}
-zD9.prototype.gG1=function(receiver){return receiver.message}
+Hd.prototype=$desc
+Hd.prototype.gkc=function(receiver){return receiver.error}
+Hd.prototype.gG1=function(receiver){return receiver.message}
 function Ul(){}Ul.builtin$cls="Ul"
 if(!"name" in Ul)Ul.name="Ul"
 $desc=$collectedClasses.Ul
@@ -25694,11 +25780,11 @@
 $desc=$collectedClasses.tV
 if($desc instanceof Array)$desc=$desc[1]
 tV.prototype=$desc
-function BT(){}BT.builtin$cls="BT"
-if(!"name" in BT)BT.name="BT"
-$desc=$collectedClasses.BT
+function KP(){}KP.builtin$cls="KP"
+if(!"name" in KP)KP.name="KP"
+$desc=$collectedClasses.KP
 if($desc instanceof Array)$desc=$desc[1]
-BT.prototype=$desc
+KP.prototype=$desc
 function yY(){}yY.builtin$cls="yY"
 if(!"name" in yY)yY.name="yY"
 $desc=$collectedClasses.yY
@@ -25757,11 +25843,11 @@
 $desc=$collectedClasses.OJ
 if($desc instanceof Array)$desc=$desc[1]
 OJ.prototype=$desc
-function Mf(){}Mf.builtin$cls="Mf"
-if(!"name" in Mf)Mf.name="Mf"
-$desc=$collectedClasses.Mf
+function Qa(){}Qa.builtin$cls="Qa"
+if(!"name" in Qa)Qa.name="Qa"
+$desc=$collectedClasses.Qa
 if($desc instanceof Array)$desc=$desc[1]
-Mf.prototype=$desc
+Qa.prototype=$desc
 function dp(){}dp.builtin$cls="dp"
 if(!"name" in dp)dp.name="dp"
 $desc=$collectedClasses.dp
@@ -25777,11 +25863,11 @@
 $desc=$collectedClasses.aG
 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
+function J6(){}J6.builtin$cls="J6"
+if(!"name" in J6)J6.name="J6"
+$desc=$collectedClasses.J6
 if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+J6.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -25906,11 +25992,11 @@
 $desc=$collectedClasses.jQ
 if($desc instanceof Array)$desc=$desc[1]
 jQ.prototype=$desc
-function Kg(){}Kg.builtin$cls="Kg"
-if(!"name" in Kg)Kg.name="Kg"
-$desc=$collectedClasses.Kg
+function mT(){}mT.builtin$cls="mT"
+if(!"name" in mT)mT.name="mT"
+$desc=$collectedClasses.mT
 if($desc instanceof Array)$desc=$desc[1]
-Kg.prototype=$desc
+mT.prototype=$desc
 function ui(){}ui.builtin$cls="ui"
 if(!"name" in ui)ui.name="ui"
 $desc=$collectedClasses.ui
@@ -25974,11 +26060,11 @@
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
-function kK(){}kK.builtin$cls="kK"
-if(!"name" in kK)kK.name="kK"
-$desc=$collectedClasses.kK
+function wf(){}wf.builtin$cls="wf"
+if(!"name" in wf)wf.name="wf"
+$desc=$collectedClasses.wf
 if($desc instanceof Array)$desc=$desc[1]
-kK.prototype=$desc
+wf.prototype=$desc
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -25989,11 +26075,11 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
-function NdT(){}NdT.builtin$cls="NdT"
-if(!"name" in NdT)NdT.name="NdT"
-$desc=$collectedClasses.NdT
+function Ic(){}Ic.builtin$cls="Ic"
+if(!"name" in Ic)Ic.name="Ic"
+$desc=$collectedClasses.Ic
 if($desc instanceof Array)$desc=$desc[1]
-NdT.prototype=$desc
+Ic.prototype=$desc
 function lc(){}lc.builtin$cls="lc"
 if(!"name" in lc)lc.name="lc"
 $desc=$collectedClasses.lc
@@ -26041,26 +26127,26 @@
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
-function ca(){}ca.builtin$cls="ca"
-if(!"name" in ca)ca.name="ca"
-$desc=$collectedClasses.ca
+function Ub(){}Ub.builtin$cls="Ub"
+if(!"name" in Ub)Ub.name="Ub"
+$desc=$collectedClasses.Ub
 if($desc instanceof Array)$desc=$desc[1]
-ca.prototype=$desc
-function um(){}um.builtin$cls="um"
-if(!"name" in um)um.name="um"
-$desc=$collectedClasses.um
+Ub.prototype=$desc
+function kK(){}kK.builtin$cls="kK"
+if(!"name" in kK)kK.name="kK"
+$desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
-um.prototype=$desc
+kK.prototype=$desc
 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
-function kL(){}kL.builtin$cls="kL"
-if(!"name" in kL)kL.name="kL"
-$desc=$collectedClasses.kL
+function um(){}um.builtin$cls="um"
+if(!"name" in um)um.name="um"
+$desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
-kL.prototype=$desc
+um.prototype=$desc
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
@@ -26140,11 +26226,11 @@
 $desc=$collectedClasses.XE
 if($desc instanceof Array)$desc=$desc[1]
 XE.prototype=$desc
-function GH(){}GH.builtin$cls="GH"
-if(!"name" in GH)GH.name="GH"
-$desc=$collectedClasses.GH
+function mO(){}mO.builtin$cls="mO"
+if(!"name" in mO)mO.name="mO"
+$desc=$collectedClasses.mO
 if($desc instanceof Array)$desc=$desc[1]
-GH.prototype=$desc
+mO.prototype=$desc
 function lo(){}lo.builtin$cls="lo"
 if(!"name" in lo)lo.name="lo"
 $desc=$collectedClasses.lo
@@ -26155,14 +26241,14 @@
 $desc=$collectedClasses.NJ
 if($desc instanceof Array)$desc=$desc[1]
 NJ.prototype=$desc
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function j24(){}j24.builtin$cls="j24"
+if(!"name" in j24)j24.name="j24"
+$desc=$collectedClasses.j24
 if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
-nd.prototype.gt5=function(receiver){return receiver.type}
-nd.prototype.st5=function(receiver,v){return receiver.type=v}
-nd.prototype.gmH=function(receiver){return receiver.href}
+j24.prototype=$desc
+j24.prototype.gt5=function(receiver){return receiver.type}
+j24.prototype.st5=function(receiver,v){return receiver.type=v}
+j24.prototype.gmH=function(receiver){return receiver.href}
 function vt(){}vt.builtin$cls="vt"
 if(!"name" in vt)vt.name="vt"
 $desc=$collectedClasses.vt
@@ -26289,11 +26375,11 @@
 $desc=$collectedClasses.cB
 if($desc instanceof Array)$desc=$desc[1]
 cB.prototype=$desc
-function Mh(){}Mh.builtin$cls="Mh"
-if(!"name" in Mh)Mh.name="Mh"
-$desc=$collectedClasses.Mh
+function uY(){}uY.builtin$cls="uY"
+if(!"name" in uY)uY.name="uY"
+$desc=$collectedClasses.uY
 if($desc instanceof Array)$desc=$desc[1]
-Mh.prototype=$desc
+uY.prototype=$desc
 function yR(){}yR.builtin$cls="yR"
 if(!"name" in yR)yR.name="yR"
 $desc=$collectedClasses.yR
@@ -26339,11 +26425,11 @@
 $desc=$collectedClasses.xt
 if($desc instanceof Array)$desc=$desc[1]
 xt.prototype=$desc
-function wx(){}wx.builtin$cls="wx"
-if(!"name" in wx)wx.name="wx"
-$desc=$collectedClasses.wx
+function VJ(){}VJ.builtin$cls="VJ"
+if(!"name" in VJ)VJ.name="VJ"
+$desc=$collectedClasses.VJ
 if($desc instanceof Array)$desc=$desc[1]
-wx.prototype=$desc
+VJ.prototype=$desc
 function P0(){}P0.builtin$cls="P0"
 if(!"name" in P0)P0.name="P0"
 $desc=$collectedClasses.P0
@@ -26376,11 +26462,11 @@
 $desc=$collectedClasses.WZ
 if($desc instanceof Array)$desc=$desc[1]
 WZ.prototype=$desc
-function rn(){}rn.builtin$cls="rn"
-if(!"name" in rn)rn.name="rn"
-$desc=$collectedClasses.rn
+function pF(){}pF.builtin$cls="pF"
+if(!"name" in pF)pF.name="pF"
+$desc=$collectedClasses.pF
 if($desc instanceof Array)$desc=$desc[1]
-rn.prototype=$desc
+pF.prototype=$desc
 function df(){}df.builtin$cls="df"
 if(!"name" in df)df.name="df"
 $desc=$collectedClasses.df
@@ -26507,11 +26593,11 @@
 $desc=$collectedClasses.vT
 if($desc instanceof Array)$desc=$desc[1]
 vT.prototype=$desc
-function VP(){}VP.builtin$cls="VP"
-if(!"name" in VP)VP.name="VP"
-$desc=$collectedClasses.VP
+function qa(){}qa.builtin$cls="qa"
+if(!"name" in qa)qa.name="qa"
+$desc=$collectedClasses.qa
 if($desc instanceof Array)$desc=$desc[1]
-VP.prototype=$desc
+qa.prototype=$desc
 function BQ(){}BQ.builtin$cls="BQ"
 if(!"name" in BQ)BQ.name="BQ"
 $desc=$collectedClasses.BQ
@@ -26682,11 +26768,11 @@
 $desc=$collectedClasses.OW
 if($desc instanceof Array)$desc=$desc[1]
 OW.prototype=$desc
-function hz(){}hz.builtin$cls="hz"
-if(!"name" in hz)hz.name="hz"
-$desc=$collectedClasses.hz
+function Dd(){}Dd.builtin$cls="Dd"
+if(!"name" in Dd)Dd.name="Dd"
+$desc=$collectedClasses.Dd
 if($desc instanceof Array)$desc=$desc[1]
-hz.prototype=$desc
+Dd.prototype=$desc
 function AP(){}AP.builtin$cls="AP"
 if(!"name" in AP)AP.name="AP"
 $desc=$collectedClasses.AP
@@ -26801,7 +26887,6 @@
 $desc=$collectedClasses.F3
 if($desc instanceof Array)$desc=$desc[1]
 F3.prototype=$desc
-F3.prototype.se0=function(v){return this.e0=v}
 function FD(mr,Rn,XZ,Rv,hG,Mo,AM){this.mr=mr
 this.Rn=Rn
 this.XZ=XZ
@@ -27054,10 +27139,346 @@
 $desc=$collectedClasses.tQ
 if($desc instanceof Array)$desc=$desc[1]
 tQ.prototype=$desc
-function G6(BW,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
+function mL(Z6,zf,AJ,Eb,AP,fn){this.Z6=Z6
+this.zf=zf
+this.AJ=AJ
+this.Eb=Eb
+this.AP=AP
+this.fn=fn}mL.builtin$cls="mL"
+if(!"name" in mL)mL.name="mL"
+$desc=$collectedClasses.mL
+if($desc instanceof Array)$desc=$desc[1]
+mL.prototype=$desc
+mL.prototype.gZ6=function(){return this.Z6}
+mL.prototype.gZ6.$reflectable=1
+mL.prototype.gzf=function(receiver){return this.zf}
+mL.prototype.gzf.$reflectable=1
+function Kf(Yb){this.Yb=Yb}Kf.builtin$cls="Kf"
+if(!"name" in Kf)Kf.name="Kf"
+$desc=$collectedClasses.Kf
+if($desc instanceof Array)$desc=$desc[1]
+Kf.prototype=$desc
+Kf.prototype.gYb=function(){return this.Yb}
+function qu(vR,bG){this.vR=vR
+this.bG=bG}qu.builtin$cls="qu"
+if(!"name" in qu)qu.name="qu"
+$desc=$collectedClasses.qu
+if($desc instanceof Array)$desc=$desc[1]
+qu.prototype=$desc
+qu.prototype.gbG=function(receiver){return this.bG}
+function bv(zf,rI,we,jF,XR,Z0,hI,am,y6,c8,LE,qU,yg,YG,jy,AP,fn){this.zf=zf
+this.rI=rI
+this.we=we
+this.jF=jF
+this.XR=XR
+this.Z0=Z0
+this.hI=hI
+this.am=am
+this.y6=y6
+this.c8=c8
+this.LE=LE
+this.qU=qU
+this.yg=yg
+this.YG=YG
+this.jy=jy
+this.AP=AP
+this.fn=fn}bv.builtin$cls="bv"
+if(!"name" in bv)bv.name="bv"
+$desc=$collectedClasses.bv
+if($desc instanceof Array)$desc=$desc[1]
+bv.prototype=$desc
+bv.prototype.gzf=function(receiver){return this.zf}
+bv.prototype.gXR=function(){return this.XR}
+bv.prototype.gXR.$reflectable=1
+bv.prototype.gZ0=function(){return this.Z0}
+bv.prototype.gZ0.$reflectable=1
+bv.prototype.gLE=function(){return this.LE}
+bv.prototype.gLE.$reflectable=1
+function eS(a){this.a=a}eS.builtin$cls="eS"
+if(!"name" in eS)eS.name="eS"
+$desc=$collectedClasses.eS
+if($desc instanceof Array)$desc=$desc[1]
+eS.prototype=$desc
+function IQ(b){this.b=b}IQ.builtin$cls="IQ"
+if(!"name" in IQ)IQ.name="IQ"
+$desc=$collectedClasses.IQ
+if($desc instanceof Array)$desc=$desc[1]
+IQ.prototype=$desc
+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 at(a,b){this.a=a
+this.b=b}at.builtin$cls="at"
+if(!"name" in at)at.name="at"
+$desc=$collectedClasses.at
+if($desc instanceof Array)$desc=$desc[1]
+at.prototype=$desc
+function wu(a,b){this.a=a
+this.b=b}wu.builtin$cls="wu"
+if(!"name" in wu)wu.name="wu"
+$desc=$collectedClasses.wu
+if($desc instanceof Array)$desc=$desc[1]
+wu.prototype=$desc
+function Vc(c,d){this.c=c
+this.d=d}Vc.builtin$cls="Vc"
+if(!"name" in Vc)Vc.name="Vc"
+$desc=$collectedClasses.Vc
+if($desc instanceof Array)$desc=$desc[1]
+Vc.prototype=$desc
+function KQ(a,b){this.a=a
+this.b=b}KQ.builtin$cls="KQ"
+if(!"name" in KQ)KQ.name="KQ"
+$desc=$collectedClasses.KQ
+if($desc instanceof Array)$desc=$desc[1]
+KQ.prototype=$desc
+function dZ(ec,jF,JL,MU,AP,fn){this.ec=ec
+this.jF=jF
+this.JL=JL
+this.MU=MU
+this.AP=AP
+this.fn=fn}dZ.builtin$cls="dZ"
+if(!"name" in dZ)dZ.name="dZ"
+$desc=$collectedClasses.dZ
+if($desc instanceof Array)$desc=$desc[1]
+dZ.prototype=$desc
+dZ.prototype.sec=function(v){return this.ec=v}
+function Qe(a){this.a=a}Qe.builtin$cls="Qe"
+if(!"name" in Qe)Qe.name="Qe"
+$desc=$collectedClasses.Qe
+if($desc instanceof Array)$desc=$desc[1]
+Qe.prototype=$desc
+function GH(a){this.a=a}GH.builtin$cls="GH"
+if(!"name" in GH)GH.name="GH"
+$desc=$collectedClasses.GH
+if($desc instanceof Array)$desc=$desc[1]
+GH.prototype=$desc
+function Q4(Yu,m7,L4,NC,xb,AP,fn){this.Yu=Yu
+this.m7=m7
+this.L4=L4
+this.NC=NC
+this.xb=xb
+this.AP=AP
+this.fn=fn}Q4.builtin$cls="Q4"
+if(!"name" in Q4)Q4.name="Q4"
+$desc=$collectedClasses.Q4
+if($desc instanceof Array)$desc=$desc[1]
+Q4.prototype=$desc
+Q4.prototype.gYu=function(){return this.Yu}
+Q4.prototype.gYu.$reflectable=1
+Q4.prototype.gm7=function(){return this.m7}
+Q4.prototype.gm7.$reflectable=1
+Q4.prototype.gL4=function(){return this.L4}
+Q4.prototype.gL4.$reflectable=1
+function WAE(Zd){this.Zd=Zd}WAE.builtin$cls="WAE"
+if(!"name" in WAE)WAE.name="WAE"
+$desc=$collectedClasses.WAE
+if($desc instanceof Array)$desc=$desc[1]
+WAE.prototype=$desc
+function N8(Yu,pO,Iw){this.Yu=Yu
+this.pO=pO
+this.Iw=Iw}N8.builtin$cls="N8"
+if(!"name" in N8)N8.name="N8"
+$desc=$collectedClasses.N8
+if($desc instanceof Array)$desc=$desc[1]
+N8.prototype=$desc
+N8.prototype.gYu=function(){return this.Yu}
+function Vi(tT,Av){this.tT=tT
+this.Av=Av}Vi.builtin$cls="Vi"
+if(!"name" in Vi)Vi.name="Vi"
+$desc=$collectedClasses.Vi
+if($desc instanceof Array)$desc=$desc[1]
+Vi.prototype=$desc
+Vi.prototype.gtT=function(receiver){return this.tT}
+Vi.prototype.gAv=function(){return this.Av}
+function kx(fY,vg,Mb,a0,VS,hw,fF,Du,va,tQ,Ge,hI,HJ,AP,fn){this.fY=fY
+this.vg=vg
+this.Mb=Mb
+this.a0=a0
+this.VS=VS
+this.hw=hw
+this.fF=fF
+this.Du=Du
+this.va=va
+this.tQ=tQ
+this.Ge=Ge
+this.hI=hI
+this.HJ=HJ
+this.AP=AP
+this.fn=fn}kx.builtin$cls="kx"
+if(!"name" in kx)kx.name="kx"
+$desc=$collectedClasses.kx
+if($desc instanceof Array)$desc=$desc[1]
+kx.prototype=$desc
+kx.prototype.gfY=function(receiver){return this.fY}
+kx.prototype.ga0=function(){return this.a0}
+kx.prototype.gVS=function(){return this.VS}
+kx.prototype.gfF=function(){return this.fF}
+kx.prototype.gDu=function(){return this.Du}
+kx.prototype.gva=function(){return this.va}
+kx.prototype.gva.$reflectable=1
+function fx(){}fx.builtin$cls="fx"
+if(!"name" in fx)fx.name="fx"
+$desc=$collectedClasses.fx
+if($desc instanceof Array)$desc=$desc[1]
+fx.prototype=$desc
+function CM(Aq,tm,hV){this.Aq=Aq
+this.tm=tm
+this.hV=hV}CM.builtin$cls="CM"
+if(!"name" in CM)CM.name="CM"
+$desc=$collectedClasses.CM
+if($desc instanceof Array)$desc=$desc[1]
+CM.prototype=$desc
+CM.prototype.gAq=function(receiver){return this.Aq}
+CM.prototype.ghV=function(){return this.hV}
+function xn(a){this.a=a}xn.builtin$cls="xn"
+if(!"name" in xn)xn.name="xn"
+$desc=$collectedClasses.xn
+if($desc instanceof Array)$desc=$desc[1]
+xn.prototype=$desc
+function vu(){}vu.builtin$cls="vu"
+if(!"name" in vu)vu.name="vu"
+$desc=$collectedClasses.vu
+if($desc instanceof Array)$desc=$desc[1]
+vu.prototype=$desc
+function c2(Rd,ye,i0,AP,fn){this.Rd=Rd
+this.ye=ye
+this.i0=i0
+this.AP=AP
+this.fn=fn}c2.builtin$cls="c2"
+if(!"name" in c2)c2.name="c2"
+$desc=$collectedClasses.c2
+if($desc instanceof Array)$desc=$desc[1]
+c2.prototype=$desc
+c2.prototype.gRd=function(receiver){return this.Rd}
+c2.prototype.gRd.$reflectable=1
+function rj(I2,VG,pw,tq,Sw,iA,AP,fn){this.I2=I2
+this.VG=VG
+this.pw=pw
+this.tq=tq
+this.Sw=Sw
+this.iA=iA
+this.AP=AP
+this.fn=fn}rj.builtin$cls="rj"
+if(!"name" in rj)rj.name="rj"
+$desc=$collectedClasses.rj
+if($desc instanceof Array)$desc=$desc[1]
+rj.prototype=$desc
+rj.prototype.gSw=function(){return this.Sw}
+rj.prototype.gSw.$reflectable=1
+function af(Aq){this.Aq=Aq}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.gAq=function(receiver){return this.Aq}
+function SI(YY,Aq,rI,we,R9,wv,V2,me){this.YY=YY
+this.Aq=Aq
+this.rI=rI
+this.we=we
+this.R9=R9
+this.wv=wv
+this.V2=V2
+this.me=me}SI.builtin$cls="SI"
+if(!"name" in SI)SI.name="SI"
+$desc=$collectedClasses.SI
+if($desc instanceof Array)$desc=$desc[1]
+SI.prototype=$desc
+function Y2(eT,yt,wd,oH){this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH}Y2.builtin$cls="Y2"
+if(!"name" in Y2)Y2.name="Y2"
+$desc=$collectedClasses.Y2
+if($desc instanceof Array)$desc=$desc[1]
+Y2.prototype=$desc
+Y2.prototype.geT=function(receiver){return this.eT}
+Y2.prototype.gyt=function(){return this.yt}
+Y2.prototype.gyt.$reflectable=1
+Y2.prototype.gwd=function(receiver){return this.wd}
+Y2.prototype.gwd.$reflectable=1
+Y2.prototype.goH=function(){return this.oH}
+Y2.prototype.goH.$reflectable=1
+function XN(rO,WT,AP,fn){this.rO=rO
+this.WT=WT
+this.AP=AP
+this.fn=fn}XN.builtin$cls="XN"
+if(!"name" in XN)XN.name="XN"
+$desc=$collectedClasses.XN
+if($desc instanceof Array)$desc=$desc[1]
+XN.prototype=$desc
+XN.prototype.gWT=function(receiver){return this.WT}
+XN.prototype.gWT.$reflectable=1
+function No(ec,i2){this.ec=ec
+this.i2=i2}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.sec=function(v){return this.ec=v}
+No.prototype.gi2=function(){return this.i2}
+No.prototype.gi2.$reflectable=1
+function PG(){}PG.builtin$cls="PG"
+if(!"name" in PG)PG.name="PG"
+$desc=$collectedClasses.PG
+if($desc instanceof Array)$desc=$desc[1]
+PG.prototype=$desc
+function YW(){}YW.builtin$cls="YW"
+if(!"name" in YW)YW.name="YW"
+$desc=$collectedClasses.YW
+if($desc instanceof Array)$desc=$desc[1]
+YW.prototype=$desc
+function BO(a){this.a=a}BO.builtin$cls="BO"
+if(!"name" in BO)BO.name="BO"
+$desc=$collectedClasses.BO
+if($desc instanceof Array)$desc=$desc[1]
+BO.prototype=$desc
+function Yu(a,b){this.a=a
+this.b=b}Yu.builtin$cls="Yu"
+if(!"name" in Yu)Yu.name="Yu"
+$desc=$collectedClasses.Yu
+if($desc instanceof Array)$desc=$desc[1]
+Yu.prototype=$desc
+function y2(c){this.c=c}y2.builtin$cls="y2"
+if(!"name" in y2)y2.name="y2"
+$desc=$collectedClasses.y2
+if($desc instanceof Array)$desc=$desc[1]
+y2.prototype=$desc
+function Hq(d){this.d=d}Hq.builtin$cls="Hq"
+if(!"name" in Hq)Hq.name="Hq"
+$desc=$collectedClasses.Hq
+if($desc instanceof Array)$desc=$desc[1]
+Hq.prototype=$desc
+function Pl(a){this.a=a}Pl.builtin$cls="Pl"
+if(!"name" in Pl)Pl.name="Pl"
+$desc=$collectedClasses.Pl
+if($desc instanceof Array)$desc=$desc[1]
+Pl.prototype=$desc
+function XK(Yu,ec,i2,AP,fn){this.Yu=Yu
+this.ec=ec
+this.i2=i2
+this.AP=AP
+this.fn=fn}XK.builtin$cls="XK"
+if(!"name" in XK)XK.name="XK"
+$desc=$collectedClasses.XK
+if($desc instanceof Array)$desc=$desc[1]
+XK.prototype=$desc
+XK.prototype.gYu=function(){return this.Yu}
+function ho(Ct,pL,ec,i2,AP,fn){this.Ct=Ct
+this.pL=pL
+this.ec=ec
+this.i2=i2
+this.AP=AP
+this.fn=fn}ho.builtin$cls="ho"
+if(!"name" in ho)ho.name="ho"
+$desc=$collectedClasses.ho
+if($desc instanceof Array)$desc=$desc[1]
+ho.prototype=$desc
+function G6(BW,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27078,11 +27499,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 Ur(){}Ur.builtin$cls="Ur"
+if(!"name" in Ur)Ur.name="Ur"
+$desc=$collectedClasses.Ur
 if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ur.prototype=$desc
 function j3(a){this.a=a}j3.builtin$cls="j3"
 if(!"name" in j3)j3.name="j3"
 $desc=$collectedClasses.j3
@@ -27093,12 +27514,11 @@
 $desc=$collectedClasses.i0
 if($desc instanceof Array)$desc=$desc[1]
 i0.prototype=$desc
-function Tg(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function Tg(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27115,10 +27535,10 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Ps(F0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Ps(F0,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27139,11 +27559,11 @@
 Ps.prototype.gF0.$reflectable=1
 Ps.prototype.sF0=function(receiver,v){return receiver.F0=v}
 Ps.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+function KU(){}KU.builtin$cls="KU"
+if(!"name" in KU)KU.name="KU"
+$desc=$collectedClasses.KU
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+KU.prototype=$desc
 function RI(a){this.a=a}RI.builtin$cls="RI"
 if(!"name" in RI)RI.name="RI"
 $desc=$collectedClasses.RI
@@ -27154,12 +27574,11 @@
 $desc=$collectedClasses.Ye
 if($desc instanceof Array)$desc=$desc[1]
 Ye.prototype=$desc
-function CN(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function CN(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27176,10 +27595,10 @@
 $desc=$collectedClasses.CN
 if($desc instanceof Array)$desc=$desc[1]
 CN.prototype=$desc
-function vc(eJ,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eJ=eJ
+function HT(eJ,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eJ=eJ
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -27191,28 +27610,25 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}vc.builtin$cls="vc"
-if(!"name" in vc)vc.name="vc"
-$desc=$collectedClasses.vc
+this.X0=X0}HT.builtin$cls="HT"
+if(!"name" in HT)HT.name="HT"
+$desc=$collectedClasses.HT
 if($desc instanceof Array)$desc=$desc[1]
-vc.prototype=$desc
-vc.prototype.geJ=function(receiver){return receiver.eJ}
-vc.prototype.geJ.$reflectable=1
-vc.prototype.seJ=function(receiver,v){return receiver.eJ=v}
-vc.prototype.seJ.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+HT.prototype=$desc
+HT.prototype.geJ=function(receiver){return receiver.eJ}
+HT.prototype.geJ.$reflectable=1
+HT.prototype.seJ=function(receiver,v){return receiver.eJ=v}
+HT.prototype.seJ.$reflectable=1
+function qbd(){}qbd.builtin$cls="qbd"
+if(!"name" in qbd)qbd.name="qbd"
+$desc=$collectedClasses.qbd
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
-function E0(zh,HX,Uy,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
+qbd.prototype=$desc
+function E0(zh,HX,Uy,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -27239,11 +27655,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 Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+Ds.prototype=$desc
 function lw(GV,Hu,nx,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
@@ -27275,11 +27691,11 @@
 lw.prototype.gnx.$reflectable=1
 lw.prototype.snx=function(receiver,v){return receiver.nx=v}
 lw.prototype.snx.$reflectable=1
-function Nr(){}Nr.builtin$cls="Nr"
-if(!"name" in Nr)Nr.name="Nr"
-$desc=$collectedClasses.Nr
+function LP(){}LP.builtin$cls="LP"
+if(!"name" in LP)LP.name="LP"
+$desc=$collectedClasses.LP
 if($desc instanceof Array)$desc=$desc[1]
-Nr.prototype=$desc
+LP.prototype=$desc
 function wJ(){}wJ.builtin$cls="wJ"
 if(!"name" in wJ)wJ.name="wJ"
 $desc=$collectedClasses.wJ
@@ -27498,10 +27914,10 @@
 $desc=$collectedClasses.YX
 if($desc instanceof Array)$desc=$desc[1]
 YX.prototype=$desc
-function BI(AY,XW,BB,eL,If){this.AY=AY
+function BI(AY,XW,BB,Ra,If){this.AY=AY
 this.XW=XW
 this.BB=BB
-this.eL=eL
+this.Ra=Ra
 this.If=If}BI.builtin$cls="BI"
 if(!"name" in BI)BI.name="BI"
 $desc=$collectedClasses.BI
@@ -27530,7 +27946,7 @@
 $desc=$collectedClasses.mg
 if($desc instanceof Array)$desc=$desc[1]
 mg.prototype=$desc
-function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,eL,RH,If){this.NK=NK
+function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If){this.NK=NK
 this.EZ=EZ
 this.ut=ut
 this.Db=Db
@@ -27543,7 +27959,7 @@
 this.qu=qu
 this.qN=qN
 this.qm=qm
-this.eL=eL
+this.Ra=Ra
 this.RH=RH
 this.If=If}bl.builtin$cls="bl"
 if(!"name" in bl)bl.name="bl"
@@ -27570,7 +27986,7 @@
 $desc=$collectedClasses.Ax
 if($desc instanceof Array)$desc=$desc[1]
 Ax.prototype=$desc
-function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,eL,RH,nz,If){this.Cr=Cr
+function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If){this.Cr=Cr
 this.Tx=Tx
 this.H8=H8
 this.Ht=Ht
@@ -27589,7 +28005,7 @@
 this.xO=xO
 this.qm=qm
 this.UF=UF
-this.eL=eL
+this.Ra=Ra
 this.RH=RH
 this.nz=nz
 this.If=If}Wf.builtin$cls="Wf"
@@ -27767,16 +28183,16 @@
 JI.prototype.siE=function(v){return this.iE=v}
 JI.prototype.gSJ=function(){return this.SJ}
 JI.prototype.sSJ=function(v){return this.SJ=v}
-function Ks(iE,SJ){this.iE=iE
-this.SJ=SJ}Ks.builtin$cls="Ks"
-if(!"name" in Ks)Ks.name="Ks"
-$desc=$collectedClasses.Ks
+function LO(iE,SJ){this.iE=iE
+this.SJ=SJ}LO.builtin$cls="LO"
+if(!"name" in LO)LO.name="LO"
+$desc=$collectedClasses.LO
 if($desc instanceof Array)$desc=$desc[1]
-Ks.prototype=$desc
-Ks.prototype.giE=function(){return this.iE}
-Ks.prototype.siE=function(v){return this.iE=v}
-Ks.prototype.gSJ=function(){return this.SJ}
-Ks.prototype.sSJ=function(v){return this.SJ=v}
+LO.prototype=$desc
+LO.prototype.giE=function(){return this.iE}
+LO.prototype.siE=function(v){return this.iE=v}
+LO.prototype.gSJ=function(){return this.SJ}
+LO.prototype.sSJ=function(v){return this.SJ=v}
 function dz(nL,QC,Gv,iE,SJ,WX,Ip){this.nL=nL
 this.QC=QC
 this.Gv=Gv
@@ -28095,12 +28511,12 @@
 $desc=$collectedClasses.O9
 if($desc instanceof Array)$desc=$desc[1]
 O9.prototype=$desc
-function oh(Y8){this.Y8=Y8}oh.builtin$cls="oh"
-if(!"name" in oh)oh.name="oh"
-$desc=$collectedClasses.oh
+function yU(Y8){this.Y8=Y8}yU.builtin$cls="yU"
+if(!"name" in yU)yU.name="yU"
+$desc=$collectedClasses.yU
 if($desc instanceof Array)$desc=$desc[1]
-oh.prototype=$desc
-oh.prototype.gY8=function(){return this.Y8}
+yU.prototype=$desc
+yU.prototype.gY8=function(){return this.Y8}
 function nP(){}nP.builtin$cls="nP"
 if(!"name" in nP)nP.name="nP"
 $desc=$collectedClasses.nP
@@ -28736,13 +29152,13 @@
 $desc=$collectedClasses.Zi
 if($desc instanceof Array)$desc=$desc[1]
 Zi.prototype=$desc
-function Ud(Ct,FN){this.Ct=Ct
+function Ud(Pc,FN){this.Pc=Pc
 this.FN=FN}Ud.builtin$cls="Ud"
 if(!"name" in Ud)Ud.name="Ud"
 $desc=$collectedClasses.Ud
 if($desc instanceof Array)$desc=$desc[1]
 Ud.prototype=$desc
-function K8(Ct,FN){this.Ct=Ct
+function K8(Pc,FN){this.Pc=Pc
 this.FN=FN}K8.builtin$cls="K8"
 if(!"name" in K8)K8.name="K8"
 $desc=$collectedClasses.K8
@@ -28787,7 +29203,7 @@
 $desc=$collectedClasses.E3
 if($desc instanceof Array)$desc=$desc[1]
 E3.prototype=$desc
-function Rw(WF,ZP,EN){this.WF=WF
+function Rw(vn,ZP,EN){this.vn=vn
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
 if(!"name" in Rw)Rw.name="Rw"
@@ -28814,11 +29230,11 @@
 $desc=$collectedClasses.a2
 if($desc instanceof Array)$desc=$desc[1]
 a2.prototype=$desc
-function Tx(){}Tx.builtin$cls="Tx"
-if(!"name" in Tx)Tx.name="Tx"
-$desc=$collectedClasses.Tx
+function Rz(){}Rz.builtin$cls="Rz"
+if(!"name" in Rz)Rz.name="Rz"
+$desc=$collectedClasses.Rz
 if($desc instanceof Array)$desc=$desc[1]
-Tx.prototype=$desc
+Rz.prototype=$desc
 function iP(y3,aL){this.y3=y3
 this.aL=aL}iP.builtin$cls="iP"
 if(!"name" in iP)iP.name="iP"
@@ -28893,11 +29309,11 @@
 $desc=$collectedClasses.Np
 if($desc instanceof Array)$desc=$desc[1]
 Np.prototype=$desc
-function mp(uF,UP,mP,SA,mZ){this.uF=uF
+function mp(uF,UP,mP,SA,FZ){this.uF=uF
 this.UP=UP
 this.mP=mP
 this.SA=SA
-this.mZ=mZ}mp.builtin$cls="mp"
+this.FZ=FZ}mp.builtin$cls="mp"
 if(!"name" in mp)mp.name="mp"
 $desc=$collectedClasses.mp
 if($desc instanceof Array)$desc=$desc[1]
@@ -28968,11 +29384,11 @@
 $desc=$collectedClasses.cX
 if($desc instanceof Array)$desc=$desc[1]
 cX.prototype=$desc
-function Yl(){}Yl.builtin$cls="Yl"
-if(!"name" in Yl)Yl.name="Yl"
-$desc=$collectedClasses.Yl
+function AC(){}AC.builtin$cls="AC"
+if(!"name" in AC)AC.name="AC"
+$desc=$collectedClasses.AC
 if($desc instanceof Array)$desc=$desc[1]
-Yl.prototype=$desc
+AC.prototype=$desc
 function Z0(){}Z0.builtin$cls="Z0"
 if(!"name" in Z0)Z0.name="Z0"
 $desc=$collectedClasses.Z0
@@ -29022,14 +29438,14 @@
 $desc=$collectedClasses.uq
 if($desc instanceof Array)$desc=$desc[1]
 uq.prototype=$desc
-function iD(NN,HC,r0,Fi,ku,tP,Ka,YG,yW){this.NN=NN
+function iD(NN,HC,r0,Fi,ku,tP,Ka,hO,yW){this.NN=NN
 this.HC=HC
 this.r0=r0
 this.Fi=Fi
 this.ku=ku
 this.tP=tP
 this.Ka=Ka
-this.YG=YG
+this.hO=hO
 this.yW=yW}iD.builtin$cls="iD"
 if(!"name" in iD)iD.name="iD"
 $desc=$collectedClasses.iD
@@ -29350,11 +29766,11 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function bO(Vy){this.Vy=Vy}bO.builtin$cls="bO"
-if(!"name" in bO)bO.name="bO"
-$desc=$collectedClasses.bO
+function hP(vm){this.vm=vm}hP.builtin$cls="hP"
+if(!"name" in hP)hP.name="hP"
+$desc=$collectedClasses.hP
 if($desc instanceof Array)$desc=$desc[1]
-bO.prototype=$desc
+hP.prototype=$desc
 function Gm(){}Gm.builtin$cls="Gm"
 if(!"name" in Gm)Gm.name="Gm"
 $desc=$collectedClasses.Gm
@@ -29504,14 +29920,14 @@
 $desc=$collectedClasses.Ys
 if($desc instanceof Array)$desc=$desc[1]
 Ys.prototype=$desc
-function WS4(ew,yz,nV,V3){this.ew=ew
+function Lw(ew,yz,nV,Li){this.ew=ew
 this.yz=yz
 this.nV=nV
-this.V3=V3}WS4.builtin$cls="WS4"
-if(!"name" in WS4)WS4.name="WS4"
-$desc=$collectedClasses.WS4
+this.Li=Li}Lw.builtin$cls="Lw"
+if(!"name" in Lw)Lw.name="Lw"
+$desc=$collectedClasses.Lw
 if($desc instanceof Array)$desc=$desc[1]
-WS4.prototype=$desc
+Lw.prototype=$desc
 function Gj(EV){this.EV=EV}Gj.builtin$cls="Gj"
 if(!"name" in Gj)Gj.name="Gj"
 $desc=$collectedClasses.Gj
@@ -29567,10 +29983,7 @@
 $desc=$collectedClasses.nA
 if($desc instanceof Array)$desc=$desc[1]
 nA.prototype=$desc
-function Fv(F8,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F8=F8
-this.AP=AP
-this.fn=fn
-this.hm=hm
+function Fv(m0,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.m0=m0
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29587,19 +30000,16 @@
 $desc=$collectedClasses.Fv
 if($desc instanceof Array)$desc=$desc[1]
 Fv.prototype=$desc
-Fv.prototype.gF8=function(receiver){return receiver.F8}
-Fv.prototype.gF8.$reflectable=1
-Fv.prototype.sF8=function(receiver,v){return receiver.F8=v}
-Fv.prototype.sF8.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+Fv.prototype.gm0=function(receiver){return receiver.m0}
+Fv.prototype.gm0.$reflectable=1
+Fv.prototype.sm0=function(receiver,v){return receiver.m0=v}
+Fv.prototype.sm0.$reflectable=1
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
-function E9(Py,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
-this.AP=AP
-this.fn=fn
-this.hm=hm
+pv.prototype=$desc
+function E9(Py,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29620,17 +30030,16 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
-function m8(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+Vfx.prototype=$desc
+function m8(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29647,10 +30056,10 @@
 $desc=$collectedClasses.m8
 if($desc instanceof Array)$desc=$desc[1]
 m8.prototype=$desc
-function Gk(vt,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
+function Gk(vt,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29671,11 +30080,11 @@
 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 Urj(){}Urj.builtin$cls="Urj"
+if(!"name" in Urj)Urj.name="Urj"
+$desc=$collectedClasses.Urj
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
+Urj.prototype=$desc
 function e5(a){this.a=a}e5.builtin$cls="e5"
 if(!"name" in e5)e5.name="e5"
 $desc=$collectedClasses.e5
@@ -29686,12 +30095,11 @@
 $desc=$collectedClasses.Ni
 if($desc instanceof Array)$desc=$desc[1]
 Ni.prototype=$desc
-function AX(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function AX(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29708,10 +30116,10 @@
 $desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
 AX.prototype=$desc
-function yb(Z8,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
+function yb(Z8,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29732,11 +30140,11 @@
 yb.prototype.gZ8.$reflectable=1
 yb.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
 yb.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function oub(){}oub.builtin$cls="oub"
+if(!"name" in oub)oub.name="oub"
+$desc=$collectedClasses.oub
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+oub.prototype=$desc
 function QR(a){this.a=a}QR.builtin$cls="QR"
 if(!"name" in QR)QR.name="QR"
 $desc=$collectedClasses.QR
@@ -29747,19 +30155,19 @@
 $desc=$collectedClasses.Yx
 if($desc instanceof Array)$desc=$desc[1]
 Yx.prototype=$desc
-function NM(GQ,J0,Oc,CO,bV,vR,LY,q3,Ol,X3,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
+function NM(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
 this.CO=CO
 this.bV=bV
-this.vR=vR
+this.kg=kg
 this.LY=LY
 this.q3=q3
 this.Ol=Ol
 this.X3=X3
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29796,10 +30204,10 @@
 NM.prototype.gbV.$reflectable=1
 NM.prototype.sbV=function(receiver,v){return receiver.bV=v}
 NM.prototype.sbV.$reflectable=1
-NM.prototype.gvR=function(receiver){return receiver.vR}
-NM.prototype.gvR.$reflectable=1
-NM.prototype.svR=function(receiver,v){return receiver.vR=v}
-NM.prototype.svR.$reflectable=1
+NM.prototype.gkg=function(receiver){return receiver.kg}
+NM.prototype.gkg.$reflectable=1
+NM.prototype.skg=function(receiver,v){return receiver.kg=v}
+NM.prototype.skg.$reflectable=1
 NM.prototype.gLY=function(receiver){return receiver.LY}
 NM.prototype.gLY.$reflectable=1
 NM.prototype.sLY=function(receiver,v){return receiver.LY=v}
@@ -29816,11 +30224,11 @@
 NM.prototype.gX3.$reflectable=1
 NM.prototype.sX3=function(receiver,v){return receiver.X3=v}
 NM.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function c4r(){}c4r.builtin$cls="c4r"
+if(!"name" in c4r)c4r.name="c4r"
+$desc=$collectedClasses.c4r
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+c4r.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -29935,12 +30343,11 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function pR(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29967,10 +30374,10 @@
 $desc=$collectedClasses.fM
 if($desc instanceof Array)$desc=$desc[1]
 fM.prototype=$desc
-function hx(Xh,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
+function hx(Xh,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -29991,12 +30398,38 @@
 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 Squ(){}Squ.builtin$cls="Squ"
+if(!"name" in Squ)Squ.name="Squ"
+$desc=$collectedClasses.Squ
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
-function u7(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
+Squ.prototype=$desc
+function PO(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
+this.AP=AP
+this.fn=fn
+this.AP=AP
+this.fn=fn
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}PO.builtin$cls="PO"
+if(!"name" in PO)PO.name="PO"
+$desc=$collectedClasses.PO
+if($desc instanceof Array)$desc=$desc[1]
+PO.prototype=$desc
+PO.prototype.gpC=function(receiver){return receiver.pC}
+PO.prototype.gpC.$reflectable=1
+PO.prototype.spC=function(receiver,v){return receiver.pC=v}
+PO.prototype.spC.$reflectable=1
+function Vf(){}Vf.builtin$cls="Vf"
+if(!"name" in Vf)Vf.name="Vf"
+$desc=$collectedClasses.Vf
+if($desc instanceof Array)$desc=$desc[1]
+Vf.prototype=$desc
+function u7(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30023,13 +30456,13 @@
 $desc=$collectedClasses.Ey
 if($desc instanceof Array)$desc=$desc[1]
 Ey.prototype=$desc
-function qm(Aq,tT,eT,yt,wd,oH,np,AP,fn){this.Aq=Aq
+function qm(Aq,tT,eT,yt,wd,oH,z3,AP,fn){this.Aq=Aq
 this.tT=tT
 this.eT=eT
 this.yt=yt
 this.wd=wd
 this.oH=oH
-this.np=np
+this.z3=z3
 this.AP=AP
 this.fn=fn}qm.builtin$cls="qm"
 if(!"name" in qm)qm.name="qm"
@@ -30044,14 +30477,17 @@
 $desc=$collectedClasses.vO
 if($desc instanceof Array)$desc=$desc[1]
 vO.prototype=$desc
-function E7(BA,fb,qY,qO,Hm,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BA=BA
+function E7(SS,fb,qY,qO,Hm,pD,eH,vk,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.SS=SS
 this.fb=fb
 this.qY=qY
 this.qO=qO
 this.Hm=Hm
+this.pD=pD
+this.eH=eH
+this.vk=vk
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30068,10 +30504,10 @@
 $desc=$collectedClasses.E7
 if($desc instanceof Array)$desc=$desc[1]
 E7.prototype=$desc
-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.gSS=function(receiver){return receiver.SS}
+E7.prototype.gSS.$reflectable=1
+E7.prototype.sSS=function(receiver,v){return receiver.SS=v}
+E7.prototype.sSS.$reflectable=1
 E7.prototype.gfb=function(receiver){return receiver.fb}
 E7.prototype.gfb.$reflectable=1
 E7.prototype.gqY=function(receiver){return receiver.qY}
@@ -30084,26 +30520,34 @@
 E7.prototype.gHm.$reflectable=1
 E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
 E7.prototype.sHm.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+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.geH=function(receiver){return receiver.eH}
+E7.prototype.geH.$reflectable=1
+E7.prototype.seH=function(receiver,v){return receiver.eH=v}
+E7.prototype.seH.$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
+function KUl(){}KUl.builtin$cls="KUl"
+if(!"name" in KUl)KUl.name="KUl"
+$desc=$collectedClasses.KUl
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
-function SV(a,b){this.a=a
-this.b=b}SV.builtin$cls="SV"
+KUl.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 vH(c){this.c=c}vH.builtin$cls="vH"
-if(!"name" in vH)vH.name="vH"
-$desc=$collectedClasses.vH
+function Mf(){}Mf.builtin$cls="Mf"
+if(!"name" in Mf)Mf.name="Mf"
+$desc=$collectedClasses.Mf
 if($desc instanceof Array)$desc=$desc[1]
-vH.prototype=$desc
-function St(Pw,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
-this.AP=AP
-this.fn=fn
-this.hm=hm
+Mf.prototype=$desc
+function Kz(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30115,27 +30559,15 @@
 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
+this.X0=X0}Kz.builtin$cls="Kz"
+if(!"name" in Kz)Kz.name="Kz"
+$desc=$collectedClasses.Kz
 if($desc instanceof Array)$desc=$desc[1]
-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 V0(){}V0.builtin$cls="V0"
-if(!"name" in V0)V0.name="V0"
-$desc=$collectedClasses.V0
-if($desc instanceof Array)$desc=$desc[1]
-V0.prototype=$desc
-function vj(eb,kf,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
+Kz.prototype=$desc
+function vj(eb,kf,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30158,17 +30590,16 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
-function LU(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+tuj.prototype=$desc
+function LU(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30185,10 +30616,10 @@
 $desc=$collectedClasses.LU
 if($desc instanceof Array)$desc=$desc[1]
 LU.prototype=$desc
-function T2(N7,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
+function T2(N7,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30209,21 +30640,21 @@
 T2.prototype.gN7.$reflectable=1
 T2.prototype.sN7=function(receiver,v){return receiver.N7=v}
 T2.prototype.sN7.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function mHk(){}mHk.builtin$cls="mHk"
+if(!"name" in mHk)mHk.name="mHk"
+$desc=$collectedClasses.mHk
 if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+mHk.prototype=$desc
 function Jq(a){this.a=a}Jq.builtin$cls="Jq"
 if(!"name" in Jq)Jq.name="Jq"
 $desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
 Jq.prototype=$desc
-function RJ(){}RJ.builtin$cls="RJ"
-if(!"name" in RJ)RJ.name="RJ"
-$desc=$collectedClasses.RJ
+function Yn(){}Yn.builtin$cls="Yn"
+if(!"name" in Yn)Yn.name="Yn"
+$desc=$collectedClasses.Yn
 if($desc instanceof Array)$desc=$desc[1]
-RJ.prototype=$desc
+Yn.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30277,8 +30708,8 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function PF(Gj,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Gj=Gj
-this.hm=hm
+function PF(Gj,ah,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Gj=Gj
+this.ah=ah
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30299,12 +30730,21 @@
 PF.prototype.gGj.$reflectable=1
 PF.prototype.sGj=function(receiver,v){return receiver.Gj=v}
 PF.prototype.sGj.$reflectable=1
-function T4(T9,Jt){this.T9=T9
-this.Jt=Jt}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+PF.prototype.gah=function(receiver){return receiver.ah}
+PF.prototype.gah.$reflectable=1
+PF.prototype.sah=function(receiver,v){return receiver.ah=v}
+PF.prototype.sah.$reflectable=1
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+Vct.prototype=$desc
+function fA(T9,Bu){this.T9=T9
+this.Bu=Bu}fA.builtin$cls="fA"
+if(!"name" in fA)fA.name="fA"
+$desc=$collectedClasses.fA
+if($desc instanceof Array)$desc=$desc[1]
+fA.prototype=$desc
 function Qz(){}Qz.builtin$cls="Qz"
 if(!"name" in Qz)Qz.name="Qz"
 $desc=$collectedClasses.Qz
@@ -30316,20 +30756,17 @@
 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 c5(){}c5.builtin$cls="c5"
 if(!"name" in c5)c5.name="c5"
 $desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
 c5.prototype=$desc
-function F1(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
-this.AP=AP
-this.fn=fn
-this.AP=AP
+function F1(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.fn=fn
 this.dZ=dZ
 this.Sa=Sa
@@ -30343,14 +30780,11 @@
 $desc=$collectedClasses.F1
 if($desc instanceof Array)$desc=$desc[1]
 F1.prototype=$desc
-function aQ(KU,ZC,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+function aQ(uy,ZC,Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
 this.ZC=ZC
 this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30365,10 +30799,10 @@
 $desc=$collectedClasses.aQ
 if($desc instanceof Array)$desc=$desc[1]
 aQ.prototype=$desc
-aQ.prototype.gKU=function(receiver){return receiver.KU}
-aQ.prototype.gKU.$reflectable=1
-aQ.prototype.sKU=function(receiver,v){return receiver.KU=v}
-aQ.prototype.sKU.$reflectable=1
+aQ.prototype.guy=function(receiver){return receiver.uy}
+aQ.prototype.guy.$reflectable=1
+aQ.prototype.suy=function(receiver,v){return receiver.uy=v}
+aQ.prototype.suy.$reflectable=1
 aQ.prototype.gZC=function(receiver){return receiver.ZC}
 aQ.prototype.gZC.$reflectable=1
 aQ.prototype.sZC=function(receiver,v){return receiver.ZC=v}
@@ -30377,18 +30811,15 @@
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
-function Qa(KU,ZC,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+D13.prototype=$desc
+function Ya5(uy,ZC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
 this.ZC=ZC
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30398,31 +30829,28 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Qa.builtin$cls="Qa"
-if(!"name" in Qa)Qa.name="Qa"
-$desc=$collectedClasses.Qa
+this.X0=X0}Ya5.builtin$cls="Ya5"
+if(!"name" in Ya5)Ya5.name="Ya5"
+$desc=$collectedClasses.Ya5
 if($desc instanceof Array)$desc=$desc[1]
-Qa.prototype=$desc
-Qa.prototype.gKU=function(receiver){return receiver.KU}
-Qa.prototype.gKU.$reflectable=1
-Qa.prototype.sKU=function(receiver,v){return receiver.KU=v}
-Qa.prototype.sKU.$reflectable=1
-Qa.prototype.gZC=function(receiver){return receiver.ZC}
-Qa.prototype.gZC.$reflectable=1
-Qa.prototype.sZC=function(receiver,v){return receiver.ZC=v}
-Qa.prototype.sZC.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+Ya5.prototype=$desc
+Ya5.prototype.guy=function(receiver){return receiver.uy}
+Ya5.prototype.guy.$reflectable=1
+Ya5.prototype.suy=function(receiver,v){return receiver.uy=v}
+Ya5.prototype.suy.$reflectable=1
+Ya5.prototype.gZC=function(receiver){return receiver.ZC}
+Ya5.prototype.gZC.$reflectable=1
+Ya5.prototype.sZC=function(receiver,v){return receiver.ZC=v}
+Ya5.prototype.sZC.$reflectable=1
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
-function vI(rU,SB,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
+WZq.prototype=$desc
+function Ww(rU,SB,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
 this.AP=AP
 this.fn=fn
-this.hm=hm
-this.AP=AP
-this.fn=fn
 this.AP=AP
 this.fn=fn
 this.dZ=dZ
@@ -30432,28 +30860,25 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}vI.builtin$cls="vI"
-if(!"name" in vI)vI.name="vI"
-$desc=$collectedClasses.vI
+this.X0=X0}Ww.builtin$cls="Ww"
+if(!"name" in Ww)Ww.name="Ww"
+$desc=$collectedClasses.Ww
 if($desc instanceof Array)$desc=$desc[1]
-vI.prototype=$desc
-vI.prototype.grU=function(receiver){return receiver.rU}
-vI.prototype.grU.$reflectable=1
-vI.prototype.srU=function(receiver,v){return receiver.rU=v}
-vI.prototype.srU.$reflectable=1
-vI.prototype.gSB=function(receiver){return receiver.SB}
-vI.prototype.gSB.$reflectable=1
-vI.prototype.sSB=function(receiver,v){return receiver.SB=v}
-vI.prototype.sSB.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+Ww.prototype=$desc
+Ww.prototype.grU=function(receiver){return receiver.rU}
+Ww.prototype.grU.$reflectable=1
+Ww.prototype.srU=function(receiver,v){return receiver.rU=v}
+Ww.prototype.srU.$reflectable=1
+Ww.prototype.gSB=function(receiver){return receiver.SB}
+Ww.prototype.gSB.$reflectable=1
+Ww.prototype.sSB=function(receiver,v){return receiver.SB=v}
+Ww.prototype.sSB.$reflectable=1
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
-function tz(Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
-this.AP=AP
-this.fn=fn
-this.hm=hm
+pva.prototype=$desc
+function tz(Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30474,16 +30899,15 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
 if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
-function fl(iy,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.iy=iy
-this.Jo=Jo
+cda.prototype=$desc
+function fl(Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30500,24 +30924,20 @@
 $desc=$collectedClasses.fl
 if($desc instanceof Array)$desc=$desc[1]
 fl.prototype=$desc
-fl.prototype.giy=function(receiver){return receiver.iy}
-fl.prototype.giy.$reflectable=1
-fl.prototype.siy=function(receiver,v){return receiver.iy=v}
-fl.prototype.siy.$reflectable=1
 fl.prototype.gJo=function(receiver){return receiver.Jo}
 fl.prototype.gJo.$reflectable=1
 fl.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 fl.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function qFb(){}qFb.builtin$cls="qFb"
+if(!"name" in qFb)qFb.name="qFb"
+$desc=$collectedClasses.qFb
 if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
-function Zt(Ap,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
+qFb.prototype=$desc
+function oM(Ap,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30529,29 +30949,29 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Zt.builtin$cls="Zt"
-if(!"name" in Zt)Zt.name="Zt"
-$desc=$collectedClasses.Zt
+this.X0=X0}oM.builtin$cls="oM"
+if(!"name" in oM)oM.name="oM"
+$desc=$collectedClasses.oM
 if($desc instanceof Array)$desc=$desc[1]
-Zt.prototype=$desc
-Zt.prototype.gAp=function(receiver){return receiver.Ap}
-Zt.prototype.gAp.$reflectable=1
-Zt.prototype.sAp=function(receiver,v){return receiver.Ap=v}
-Zt.prototype.sAp.$reflectable=1
-Zt.prototype.gJo=function(receiver){return receiver.Jo}
-Zt.prototype.gJo.$reflectable=1
-Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
-Zt.prototype.sJo.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+oM.prototype=$desc
+oM.prototype.gAp=function(receiver){return receiver.Ap}
+oM.prototype.gAp.$reflectable=1
+oM.prototype.sAp=function(receiver,v){return receiver.Ap=v}
+oM.prototype.sAp.$reflectable=1
+oM.prototype.gJo=function(receiver){return receiver.Jo}
+oM.prototype.gJo.$reflectable=1
+oM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
+oM.prototype.sJo.$reflectable=1
+function rna(){}rna.builtin$cls="rna"
+if(!"name" in rna)rna.name="rna"
+$desc=$collectedClasses.rna
 if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
-function wM(Au,Jo,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
+rna.prototype=$desc
+function wM(Au,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30576,334 +30996,13 @@
 wM.prototype.gJo.$reflectable=1
 wM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 wM.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function Vba(){}Vba.builtin$cls="Vba"
+if(!"name" in Vba)Vba.name="Vba"
+$desc=$collectedClasses.Vba
 if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
-function mL(Z6,DF,nI,AP,fn){this.Z6=Z6
-this.DF=DF
-this.nI=nI
-this.AP=AP
-this.fn=fn}mL.builtin$cls="mL"
-if(!"name" in mL)mL.name="mL"
-$desc=$collectedClasses.mL
-if($desc instanceof Array)$desc=$desc[1]
-mL.prototype=$desc
-mL.prototype.gZ6=function(){return this.Z6}
-mL.prototype.gZ6.$reflectable=1
-mL.prototype.gDF=function(){return this.DF}
-mL.prototype.gDF.$reflectable=1
-mL.prototype.gnI=function(){return this.nI}
-mL.prototype.gnI.$reflectable=1
-function Kf(oV){this.oV=oV}Kf.builtin$cls="Kf"
-if(!"name" in Kf)Kf.name="Kf"
-$desc=$collectedClasses.Kf
-if($desc instanceof Array)$desc=$desc[1]
-Kf.prototype=$desc
-Kf.prototype.goV=function(){return this.oV}
-function qu(YZ,bG){this.YZ=YZ
-this.bG=bG}qu.builtin$cls="qu"
-if(!"name" in qu)qu.name="qu"
-$desc=$collectedClasses.qu
-if($desc instanceof Array)$desc=$desc[1]
-qu.prototype=$desc
-qu.prototype.gbG=function(receiver){return this.bG}
-function bv(WP,XR,Z0,md,mY,e8,F3,Gg,LE,iP,mU,mM,Td,AP,fn){this.WP=WP
-this.XR=XR
-this.Z0=Z0
-this.md=md
-this.mY=mY
-this.e8=e8
-this.F3=F3
-this.Gg=Gg
-this.LE=LE
-this.iP=iP
-this.mU=mU
-this.mM=mM
-this.Td=Td
-this.AP=AP
-this.fn=fn}bv.builtin$cls="bv"
-if(!"name" in bv)bv.name="bv"
-$desc=$collectedClasses.bv
-if($desc instanceof Array)$desc=$desc[1]
-bv.prototype=$desc
-bv.prototype.gXR=function(){return this.XR}
-bv.prototype.gXR.$reflectable=1
-bv.prototype.gZ0=function(){return this.Z0}
-bv.prototype.gZ0.$reflectable=1
-bv.prototype.gLE=function(){return this.LE}
-bv.prototype.gLE.$reflectable=1
-function eS(a){this.a=a}eS.builtin$cls="eS"
-if(!"name" in eS)eS.name="eS"
-$desc=$collectedClasses.eS
-if($desc instanceof Array)$desc=$desc[1]
-eS.prototype=$desc
-function IQ(){}IQ.builtin$cls="IQ"
-if(!"name" in IQ)IQ.name="IQ"
-$desc=$collectedClasses.IQ
-if($desc instanceof Array)$desc=$desc[1]
-IQ.prototype=$desc
-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 yU(XT,i2,AP,fn){this.XT=XT
-this.i2=i2
-this.AP=AP
-this.fn=fn}yU.builtin$cls="yU"
-if(!"name" in yU)yU.name="yU"
-$desc=$collectedClasses.yU
-if($desc instanceof Array)$desc=$desc[1]
-yU.prototype=$desc
-yU.prototype.sXT=function(v){return this.XT=v}
-yU.prototype.gi2=function(){return this.i2}
-yU.prototype.gi2.$reflectable=1
-function Ub(a){this.a=a}Ub.builtin$cls="Ub"
-if(!"name" in Ub)Ub.name="Ub"
-$desc=$collectedClasses.Ub
-if($desc instanceof Array)$desc=$desc[1]
-Ub.prototype=$desc
-function dY(a){this.a=a}dY.builtin$cls="dY"
-if(!"name" in dY)dY.name="dY"
-$desc=$collectedClasses.dY
-if($desc instanceof Array)$desc=$desc[1]
-dY.prototype=$desc
-function vY(a,b){this.a=a
-this.b=b}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 zZ(c){this.c=c}zZ.builtin$cls="zZ"
-if(!"name" in zZ)zZ.name="zZ"
-$desc=$collectedClasses.zZ
-if($desc instanceof Array)$desc=$desc[1]
-zZ.prototype=$desc
-function dS(d){this.d=d}dS.builtin$cls="dS"
-if(!"name" in dS)dS.name="dS"
-$desc=$collectedClasses.dS
-if($desc instanceof Array)$desc=$desc[1]
-dS.prototype=$desc
-function dZ(XT,WP,kg,UL,AP,fn){this.XT=XT
-this.WP=WP
-this.kg=kg
-this.UL=UL
-this.AP=AP
-this.fn=fn}dZ.builtin$cls="dZ"
-if(!"name" in dZ)dZ.name="dZ"
-$desc=$collectedClasses.dZ
-if($desc instanceof Array)$desc=$desc[1]
-dZ.prototype=$desc
-dZ.prototype.sXT=function(v){return this.XT=v}
-function Qe(a){this.a=a}Qe.builtin$cls="Qe"
-if(!"name" in Qe)Qe.name="Qe"
-$desc=$collectedClasses.Qe
-if($desc instanceof Array)$desc=$desc[1]
-Qe.prototype=$desc
-function DP(Yu,m7,L4,Fv,ZZ,AP,fn){this.Yu=Yu
-this.m7=m7
-this.L4=L4
-this.Fv=Fv
-this.ZZ=ZZ
-this.AP=AP
-this.fn=fn}DP.builtin$cls="DP"
-if(!"name" in DP)DP.name="DP"
-$desc=$collectedClasses.DP
-if($desc instanceof Array)$desc=$desc[1]
-DP.prototype=$desc
-DP.prototype.gYu=function(){return this.Yu}
-DP.prototype.gYu.$reflectable=1
-DP.prototype.gm7=function(){return this.m7}
-DP.prototype.gm7.$reflectable=1
-DP.prototype.gL4=function(){return this.L4}
-DP.prototype.gL4.$reflectable=1
-function WAE(eg){this.eg=eg}WAE.builtin$cls="WAE"
-if(!"name" in WAE)WAE.name="WAE"
-$desc=$collectedClasses.WAE
-if($desc instanceof Array)$desc=$desc[1]
-WAE.prototype=$desc
-function N8(Yu,z4,Iw){this.Yu=Yu
-this.z4=z4
-this.Iw=Iw}N8.builtin$cls="N8"
-if(!"name" in N8)N8.name="N8"
-$desc=$collectedClasses.N8
-if($desc instanceof Array)$desc=$desc[1]
-N8.prototype=$desc
-N8.prototype.gYu=function(){return this.Yu}
-function Vi(tT,Ou){this.tT=tT
-this.Ou=Ou}Vi.builtin$cls="Vi"
-if(!"name" in Vi)Vi.name="Vi"
-$desc=$collectedClasses.Vi
-if($desc instanceof Array)$desc=$desc[1]
-Vi.prototype=$desc
-Vi.prototype.gtT=function(receiver){return this.tT}
-Vi.prototype.gOu=function(){return this.Ou}
-function kx(fY,vg,Mb,a0,VS,hw,fF,Du,va,Qo,uP,mY,B0,AP,fn){this.fY=fY
-this.vg=vg
-this.Mb=Mb
-this.a0=a0
-this.VS=VS
-this.hw=hw
-this.fF=fF
-this.Du=Du
-this.va=va
-this.Qo=Qo
-this.uP=uP
-this.mY=mY
-this.B0=B0
-this.AP=AP
-this.fn=fn}kx.builtin$cls="kx"
-if(!"name" in kx)kx.name="kx"
-$desc=$collectedClasses.kx
-if($desc instanceof Array)$desc=$desc[1]
-kx.prototype=$desc
-kx.prototype.gfY=function(receiver){return this.fY}
-kx.prototype.ga0=function(){return this.a0}
-kx.prototype.gVS=function(){return this.VS}
-kx.prototype.gfF=function(){return this.fF}
-kx.prototype.gDu=function(){return this.Du}
-kx.prototype.gva=function(){return this.va}
-kx.prototype.gva.$reflectable=1
-function fx(){}fx.builtin$cls="fx"
-if(!"name" in fx)fx.name="fx"
-$desc=$collectedClasses.fx
-if($desc instanceof Array)$desc=$desc[1]
-fx.prototype=$desc
-function CM(Aq,jV,hV){this.Aq=Aq
-this.jV=jV
-this.hV=hV}CM.builtin$cls="CM"
-if(!"name" in CM)CM.name="CM"
-$desc=$collectedClasses.CM
-if($desc instanceof Array)$desc=$desc[1]
-CM.prototype=$desc
-CM.prototype.gAq=function(receiver){return this.Aq}
-CM.prototype.ghV=function(){return this.hV}
-function xn(a){this.a=a}xn.builtin$cls="xn"
-if(!"name" in xn)xn.name="xn"
-$desc=$collectedClasses.xn
-if($desc instanceof Array)$desc=$desc[1]
-xn.prototype=$desc
-function vu(){}vu.builtin$cls="vu"
-if(!"name" in vu)vu.name="vu"
-$desc=$collectedClasses.vu
-if($desc instanceof Array)$desc=$desc[1]
-vu.prototype=$desc
-function c2(Rd,eB,P2,AP,fn){this.Rd=Rd
-this.eB=eB
-this.P2=P2
-this.AP=AP
-this.fn=fn}c2.builtin$cls="c2"
-if(!"name" in c2)c2.name="c2"
-$desc=$collectedClasses.c2
-if($desc instanceof Array)$desc=$desc[1]
-c2.prototype=$desc
-c2.prototype.gRd=function(receiver){return this.Rd}
-c2.prototype.gRd.$reflectable=1
-function rj(W6,xN,ei,Hz,Sw,UK,AP,fn){this.W6=W6
-this.xN=xN
-this.ei=ei
-this.Hz=Hz
-this.Sw=Sw
-this.UK=UK
-this.AP=AP
-this.fn=fn}rj.builtin$cls="rj"
-if(!"name" in rj)rj.name="rj"
-$desc=$collectedClasses.rj
-if($desc instanceof Array)$desc=$desc[1]
-rj.prototype=$desc
-rj.prototype.gSw=function(){return this.Sw}
-rj.prototype.gSw.$reflectable=1
-function Nu(XT,e0){this.XT=XT
-this.e0=e0}Nu.builtin$cls="Nu"
-if(!"name" in Nu)Nu.name="Nu"
-$desc=$collectedClasses.Nu
-if($desc instanceof Array)$desc=$desc[1]
-Nu.prototype=$desc
-Nu.prototype.sXT=function(v){return this.XT=v}
-Nu.prototype.se0=function(v){return this.e0=v}
-function Q4(a,b,c){this.a=a
-this.b=b
-this.c=c}Q4.builtin$cls="Q4"
-if(!"name" in Q4)Q4.name="Q4"
-$desc=$collectedClasses.Q4
-if($desc instanceof Array)$desc=$desc[1]
-Q4.prototype=$desc
-function aJ(a,b){this.a=a
-this.b=b}aJ.builtin$cls="aJ"
-if(!"name" in aJ)aJ.name="aJ"
-$desc=$collectedClasses.aJ
-if($desc instanceof Array)$desc=$desc[1]
-aJ.prototype=$desc
-function u4(c,d,e){this.c=c
-this.d=d
-this.e=e}u4.builtin$cls="u4"
-if(!"name" in u4)u4.name="u4"
-$desc=$collectedClasses.u4
-if($desc instanceof Array)$desc=$desc[1]
-u4.prototype=$desc
-function pF(a){this.a=a}pF.builtin$cls="pF"
-if(!"name" in pF)pF.name="pF"
-$desc=$collectedClasses.pF
-if($desc instanceof Array)$desc=$desc[1]
-pF.prototype=$desc
-function Q2(){}Q2.builtin$cls="Q2"
-if(!"name" in Q2)Q2.name="Q2"
-$desc=$collectedClasses.Q2
-if($desc instanceof Array)$desc=$desc[1]
-Q2.prototype=$desc
-function r1(XT,e0,SI,Tj,AP,fn){this.XT=XT
-this.e0=e0
-this.SI=SI
-this.Tj=Tj
-this.AP=AP
-this.fn=fn}r1.builtin$cls="r1"
-if(!"name" in r1)r1.name="r1"
-$desc=$collectedClasses.r1
-if($desc instanceof Array)$desc=$desc[1]
-r1.prototype=$desc
-function Rb(eA,Wj,XT,e0,SI,Tj,AP,fn){this.eA=eA
-this.Wj=Wj
-this.XT=XT
-this.e0=e0
-this.SI=SI
-this.Tj=Tj
-this.AP=AP
-this.fn=fn}Rb.builtin$cls="Rb"
-if(!"name" in Rb)Rb.name="Rb"
-$desc=$collectedClasses.Rb
-if($desc instanceof Array)$desc=$desc[1]
-Rb.prototype=$desc
-function Y2(eT,yt,wd,oH){this.eT=eT
-this.yt=yt
-this.wd=wd
-this.oH=oH}Y2.builtin$cls="Y2"
-if(!"name" in Y2)Y2.name="Y2"
-$desc=$collectedClasses.Y2
-if($desc instanceof Array)$desc=$desc[1]
-Y2.prototype=$desc
-Y2.prototype.geT=function(receiver){return this.eT}
-Y2.prototype.gyt=function(){return this.yt}
-Y2.prototype.gyt.$reflectable=1
-Y2.prototype.gwd=function(receiver){return this.wd}
-Y2.prototype.gwd.$reflectable=1
-Y2.prototype.goH=function(){return this.oH}
-Y2.prototype.goH.$reflectable=1
-function XN(JL,WT,AP,fn){this.JL=JL
-this.WT=WT
-this.AP=AP
-this.fn=fn}XN.builtin$cls="XN"
-if(!"name" in XN)XN.name="XN"
-$desc=$collectedClasses.XN
-if($desc instanceof Array)$desc=$desc[1]
-XN.prototype=$desc
-XN.prototype.gWT=function(receiver){return this.WT}
-XN.prototype.gWT.$reflectable=1
-function lI(k5,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.AP=AP
-this.fn=fn
-this.hm=hm
+Vba.prototype=$desc
+function lI(k5,xH,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.xH=xH
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -30924,15 +31023,16 @@
 lI.prototype.gk5.$reflectable=1
 lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
 lI.prototype.sk5.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+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 waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function uL(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
-this.AP=AP
-this.fn=fn
-this.AP=AP
+waa.prototype=$desc
+function uL(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.fn=fn
 this.dZ=dZ
 this.Sa=Sa
@@ -30946,15 +31046,6 @@
 $desc=$collectedClasses.uL
 if($desc instanceof Array)$desc=$desc[1]
 uL.prototype=$desc
-uL.prototype.ghm=function(receiver){return receiver.hm}
-uL.prototype.ghm.$reflectable=1
-uL.prototype.shm=function(receiver,v){return receiver.hm=v}
-uL.prototype.shm.$reflectable=1
-function LP(){}LP.builtin$cls="LP"
-if(!"name" in LP)LP.name="LP"
-$desc=$collectedClasses.LP
-if($desc instanceof Array)$desc=$desc[1]
-LP.prototype=$desc
 function Pi(){}Pi.builtin$cls="Pi"
 if(!"name" in Pi)Pi.name="Pi"
 $desc=$collectedClasses.Pi
@@ -31041,11 +31132,11 @@
 DA.prototype=$desc
 DA.prototype.gWA=function(){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
-function ndx(){}ndx.builtin$cls="ndx"
-if(!"name" in ndx)ndx.name="ndx"
-$desc=$collectedClasses.ndx
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
 if($desc instanceof Array)$desc=$desc[1]
-ndx.prototype=$desc
+nd.prototype=$desc
 function vly(){}vly.builtin$cls="vly"
 if(!"name" in vly)vly.name="vly"
 $desc=$collectedClasses.vly
@@ -31148,11 +31239,11 @@
 $desc=$collectedClasses.C4
 if($desc instanceof Array)$desc=$desc[1]
 C4.prototype=$desc
-function Md(){}Md.builtin$cls="Md"
-if(!"name" in Md)Md.name="Md"
-$desc=$collectedClasses.Md
+function YJ(){}YJ.builtin$cls="YJ"
+if(!"name" in YJ)YJ.name="YJ"
+$desc=$collectedClasses.YJ
 if($desc instanceof Array)$desc=$desc[1]
-Md.prototype=$desc
+YJ.prototype=$desc
 function km(a){this.a=a}km.builtin$cls="km"
 if(!"name" in km)km.name="km"
 $desc=$collectedClasses.km
@@ -31214,11 +31305,11 @@
 $desc=$collectedClasses.MX
 if($desc instanceof Array)$desc=$desc[1]
 MX.prototype=$desc
-function w9(){}w9.builtin$cls="w9"
-if(!"name" in w9)w9.name="w9"
-$desc=$collectedClasses.w9
+function w10(){}w10.builtin$cls="w10"
+if(!"name" in w10)w10.name="w10"
+$desc=$collectedClasses.w10
 if($desc instanceof Array)$desc=$desc[1]
-w9.prototype=$desc
+w10.prototype=$desc
 function r3y(a){this.a=a}r3y.builtin$cls="r3y"
 if(!"name" in r3y)r3y.name="r3y"
 $desc=$collectedClasses.r3y
@@ -31501,11 +31592,6 @@
 $desc=$collectedClasses.bX
 if($desc instanceof Array)$desc=$desc[1]
 bX.prototype=$desc
-function lP(){}lP.builtin$cls="lP"
-if(!"name" in lP)lP.name="lP"
-$desc=$collectedClasses.lP
-if($desc instanceof Array)$desc=$desc[1]
-lP.prototype=$desc
 function Uf(){}Uf.builtin$cls="Uf"
 if(!"name" in Uf)Uf.name="Uf"
 $desc=$collectedClasses.Uf
@@ -31581,6 +31667,11 @@
 $desc=$collectedClasses.w7
 if($desc instanceof Array)$desc=$desc[1]
 w7.prototype=$desc
+function w9(){}w9.builtin$cls="w9"
+if(!"name" in w9)w9.name="w9"
+$desc=$collectedClasses.w9
+if($desc instanceof Array)$desc=$desc[1]
+w9.prototype=$desc
 function c4(a){this.a=a}c4.builtin$cls="c4"
 if(!"name" in c4)c4.name="c4"
 $desc=$collectedClasses.c4
@@ -32004,7 +32095,7 @@
 $desc=$collectedClasses.cfS
 if($desc instanceof Array)$desc=$desc[1]
 cfS.prototype=$desc
-function JG(hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hm=hm
+function JG(kW,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kW=kW
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32021,15 +32112,23 @@
 $desc=$collectedClasses.JG
 if($desc instanceof Array)$desc=$desc[1]
 JG.prototype=$desc
-function knI(zw,AP,fn,tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
+JG.prototype.gkW=function(receiver){return receiver.kW}
+JG.prototype.gkW.$reflectable=1
+JG.prototype.skW=function(receiver,v){return receiver.kW=v}
+JG.prototype.skW.$reflectable=1
+function V0(){}V0.builtin$cls="V0"
+if(!"name" in V0)V0.name="V0"
+$desc=$collectedClasses.V0
+if($desc instanceof Array)$desc=$desc[1]
+V0.prototype=$desc
+function knI(zw,AP,fn,tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
 this.fn=fn
 this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32055,10 +32154,10 @@
 $desc=$collectedClasses.T5
 if($desc instanceof Array)$desc=$desc[1]
 T5.prototype=$desc
-function fI(Uz,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
+function fI(Uz,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32079,13 +32178,12 @@
 fI.prototype.gUz.$reflectable=1
 fI.prototype.sUz=function(receiver,v){return receiver.Uz=v}
 fI.prototype.sUz.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+function oaa(){}oaa.builtin$cls="oaa"
+if(!"name" in oaa)oaa.name="oaa"
+$desc=$collectedClasses.oaa
 if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
+oaa.prototype=$desc
+function qq(a){this.a=a}qq.builtin$cls="qq"
 if(!"name" in qq)qq.name="qq"
 $desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
@@ -32095,12 +32193,11 @@
 $desc=$collectedClasses.FC
 if($desc instanceof Array)$desc=$desc[1]
 FC.prototype=$desc
-function xI(tY,Pe,m0,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function xI(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
-this.m0=m0
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32125,19 +32222,15 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-xI.prototype.gm0=function(receiver){return receiver.m0}
-xI.prototype.gm0.$reflectable=1
-xI.prototype.sm0=function(receiver,v){return receiver.m0=v}
-xI.prototype.sm0.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function Sq(){}Sq.builtin$cls="Sq"
+if(!"name" in Sq)Sq.name="Sq"
+$desc=$collectedClasses.Sq
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
-function nm(Va,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
+Sq.prototype=$desc
+function nm(Va,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32158,15 +32251,15 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function q2(){}q2.builtin$cls="q2"
+if(!"name" in q2)q2.name="q2"
+$desc=$collectedClasses.q2
 if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
-function Vu(V4,AP,fn,hm,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.V4=V4
+q2.prototype=$desc
+function uwf(Up,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Up=Up
 this.AP=AP
 this.fn=fn
-this.hm=hm
+this.pC=pC
 this.AP=AP
 this.fn=fn
 this.AP=AP
@@ -32178,20 +32271,20 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Vu.builtin$cls="Vu"
-if(!"name" in Vu)Vu.name="Vu"
-$desc=$collectedClasses.Vu
+this.X0=X0}uwf.builtin$cls="uwf"
+if(!"name" in uwf)uwf.name="uwf"
+$desc=$collectedClasses.uwf
 if($desc instanceof Array)$desc=$desc[1]
-Vu.prototype=$desc
-Vu.prototype.gV4=function(receiver){return receiver.V4}
-Vu.prototype.gV4.$reflectable=1
-Vu.prototype.sV4=function(receiver,v){return receiver.V4=v}
-Vu.prototype.sV4.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+uwf.prototype=$desc
+uwf.prototype.gUp=function(receiver){return receiver.Up}
+uwf.prototype.gUp.$reflectable=1
+uwf.prototype.sUp=function(receiver,v){return receiver.Up=v}
+uwf.prototype.sUp.$reflectable=1
+function q3(){}q3.builtin$cls="q3"
+if(!"name" in q3)q3.name="q3"
+$desc=$collectedClasses.q3
 if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
+q3.prototype=$desc
 function At(a){this.a=a}At.builtin$cls="At"
 if(!"name" in At)At.name="At"
 $desc=$collectedClasses.At
@@ -32209,17 +32302,17 @@
 $desc=$collectedClasses.V2
 if($desc instanceof Array)$desc=$desc[1]
 V2.prototype=$desc
-function D8(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
+function BT(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
 this.qP=qP
 this.ZY=ZY
 this.xS=xS
 this.PB=PB
 this.eS=eS
-this.ay=ay}D8.builtin$cls="D8"
-if(!"name" in D8)D8.name="D8"
-$desc=$collectedClasses.D8
+this.ay=ay}BT.builtin$cls="BT"
+if(!"name" in BT)BT.name="BT"
+$desc=$collectedClasses.BT
 if($desc instanceof Array)$desc=$desc[1]
-D8.prototype=$desc
+BT.prototype=$desc
 function jY(Ca,qP,ZY,xS,PB,eS,ay){this.Ca=Ca
 this.qP=qP
 this.ZY=ZY
@@ -32236,11 +32329,11 @@
 $desc=$collectedClasses.H2
 if($desc instanceof Array)$desc=$desc[1]
 H2.prototype=$desc
-function YJ(){}YJ.builtin$cls="YJ"
-if(!"name" in YJ)YJ.name="YJ"
-$desc=$collectedClasses.YJ
+function DO(){}DO.builtin$cls="DO"
+if(!"name" in DO)DO.name="DO"
+$desc=$collectedClasses.DO
 if($desc instanceof Array)$desc=$desc[1]
-YJ.prototype=$desc
+DO.prototype=$desc
 function fTP(a){this.a=a}fTP.builtin$cls="fTP"
 if(!"name" in fTP)fTP.name="fTP"
 $desc=$collectedClasses.fTP
@@ -32347,10 +32440,10 @@
 $desc=$collectedClasses.ug
 if($desc instanceof Array)$desc=$desc[1]
 ug.prototype=$desc
-function DT(lr,xT,kr,Mf,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
+function DT(lr,xT,kr,Dsl,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
 this.xT=xT
 this.kr=kr
-this.Mf=Mf
+this.Dsl=Dsl
 this.QO=QO
 this.jH=jH
 this.mj=mj
@@ -32375,11 +32468,11 @@
 $desc=$collectedClasses.OB
 if($desc instanceof Array)$desc=$desc[1]
 OB.prototype=$desc
-function DO(){}DO.builtin$cls="DO"
-if(!"name" in DO)DO.name="DO"
-$desc=$collectedClasses.DO
+function lP(){}lP.builtin$cls="lP"
+if(!"name" in lP)lP.name="lP"
+$desc=$collectedClasses.lP
 if($desc instanceof Array)$desc=$desc[1]
-DO.prototype=$desc
+lP.prototype=$desc
 function p8(ud,lr,eS,ay){this.ud=ud
 this.lr=lr
 this.eS=eS
@@ -32473,11 +32566,11 @@
 $desc=$collectedClasses.wl
 if($desc instanceof Array)$desc=$desc[1]
 wl.prototype=$desc
-function ve(){}ve.builtin$cls="ve"
-if(!"name" in ve)ve.name="ve"
-$desc=$collectedClasses.ve
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-ve.prototype=$desc
+T4.prototype=$desc
 function TR(qP){this.qP=qP}TR.builtin$cls="TR"
 if(!"name" in TR)TR.name="TR"
 $desc=$collectedClasses.TR
@@ -32489,4 +32582,30 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-return[qE,ho,Gh,A0,na,Mr,zx,P2,Xk,W2,it,Az,QP,QW,jr,Ny,Zv,QQS,BR,di,d7,yJ,He,vz,vHT,n0,Em,pt,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,Aa,u5,h4,W4,jP,Hd,tA,wa,Uq,QH,Rt,X2,zU,rk,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,fJ,BK,Rv,HO,Kk,ZY,DD,EeC,Qb,PG,xe,Hw,bn,Imr,Ve,Oq,H9,o4,oU,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,FH,SN,HD,ni,jg,qj,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,CY,Wt,uaa,zD9,Ul,G5,bk,Lx,Er,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,Dn,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,hq,UL,tZ,kc,AK,ty,Nf,F2,nL,QV,q0,Q7,hF,OF,Dh,Ue,mU,NE,lC,y5,jQ,Kg,ui,mk,DQ,Sm,LM,es,eG,bd,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,tk,me,oB,nh,EI,MI,ca,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,uzr,Yd,kN,lZ,Gr,XE,GH,lo,NJ,nd,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,tL,pyk,ZD,rD,wD,Wv,yz,Fi,Ja,mj,cB,Mh,yR,GK,xJ,Nn,Et,NC,nb,Zn,xt,wx,P0,xlX,SQ,qD,TM,WZ,rn,df,Hg,L3,zz,dE,Eb,dT,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,cC,RA,IY,JH,jl,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,oo,OW,hz,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,bw,WT,jJ,XR,LI,A2,IW,F3,FD,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,dN,GT,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,G6,Vf,j3,i0,Tg,Ps,pv,RI,Ye,CN,vc,Vfx,E0,Dsd,lw,Nr,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,H6,wB,U1,SJ,SU7,Qr,w2Y,iK,GD,Sn,nI,TY,Lj,mb,am,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,U7,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,Ks,dz,tK,OR,Bg,DL,b8,j7,ff,Ia,Zf,vs,da,xw,dm,rH,ZL,rq,RW,RT,jZ,FZ,OM,qh,tG,jv,LB,zn,lz,Rl,Jb,M4,Jp,h7,pr,eN,PI,uO,j4,i9,VV,Dy,lU,OC,UH,Z5,ii,ib,MO,O9,oh,nP,KA,Vo,qB,ez,ti,LV,DS,JF,ht,CR,Qk,v1y,uR,Q0,YR,fB,nO,t3,dq,lO,aY,zG,e4,JB,Id,WH,TF,K5,Cg,Hs,dv,pV,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,ey,xd,v6,db,i5,N6,Rr,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,vX,Ba,An,bF,LD,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,wI,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,Hn,Zl,B5,a6,P7,DW,Ge,LK,AT,bJ,Np,mp,ub,ds,lj,UV,VS,t7,HG,aE,eV,kM,EH,cX,Yl,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hb,XX,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,ecX,kI,yoo,w1p,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,IU,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,ac,RS,RY,Ys,WS4,Gj,U4,B8q,Nx,LZ,Dg,Ob,Ip,Pg,Nb,nA,Fv,tuj,E9,Vct,m8,Gk,D13,e5,Ni,AX,yb,WZq,QR,Yx,NM,pva,nx,jm,xj,VB,aI,rG,yh,wO,Tm,q1,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,fM,hx,cda,u7,fW,Ey,qm,vO,E7,waa,SV,vH,St,V0,vj,V4,LU,T2,V10,Jq,RJ,TJ,dG,qV,HV,em,Lb,PF,T4,Qz,jA,PO,c5,F1,aQ,V11,Qa,V12,vI,V13,tz,V14,fl,V15,Zt,V16,wM,V17,mL,Kf,qu,bv,eS,IQ,TI,yU,Ub,dY,vY,zZ,dS,dZ,Qe,DP,WAE,N8,Vi,kx,fx,CM,xn,vu,c2,rj,Nu,Q4,aJ,u4,pF,Q2,r1,Rb,Y2,XN,lI,V18,uL,LP,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,Ay,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w9,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,Bl,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,G0,mY,GX,mB,XF,bX,lP,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,c4,z6,Ay0,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,mG,uA,vl,Li,WK,iT,ja,zw,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,cfS,JG,knI,T5,fI,V19,qq,FC,xI,Ds,nm,V20,Vu,V21,At,Sb,V2,D8,jY,H2,YJ,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,XI,hs,yp,ug,DT,OB,DO,p8,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+function Zt(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
+this.AP=AP
+this.fn=fn
+this.AP=AP
+this.fn=fn
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Zt.builtin$cls="Zt"
+if(!"name" in Zt)Zt.name="Zt"
+$desc=$collectedClasses.Zt
+if($desc instanceof Array)$desc=$desc[1]
+Zt.prototype=$desc
+Zt.prototype.gJh=function(receiver){return receiver.Jh}
+Zt.prototype.gJh.$reflectable=1
+Zt.prototype.sJh=function(receiver,v){return receiver.Jh=v}
+Zt.prototype.sJh.$reflectable=1
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
+if($desc instanceof Array)$desc=$desc[1]
+Dsd.prototype=$desc
+return[qE,pa,Gh,A0,na,Mr,zx,P2,Xk,W2,it,Az,QP,QW,jr,Ny,Zv,Yr,BR,di,d7,yJ,He,vz,vHT,n0,Em,pt,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,Aa,u5,Tq,W4,jP,Cz,tA,wa,Uq,QH,Rt,X2,zU,rk,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,fJ,BK,Rv,HO,Kk,ZY,Hy,EeC,Qb,Vu,xe,Hw,bn,Imr,Ve,CX,H9,FI,oU,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,FH,SN,HD,ni,jg,qj,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,CY,Wt,uaa,Hd,Ul,G5,bk,Lx,Er,qk,GI,Tb,tV,KP,yY,kJ,AE,xV,Dn,y6,RH,pU,OJ,Qa,dp,vw,aG,J6,u9,Bn,hq,UL,tZ,kc,AK,ty,Nf,F2,nL,QV,q0,Q7,hF,OF,Dh,Ue,mU,NE,lC,y5,jQ,mT,ui,mk,DQ,Sm,LM,es,eG,bd,pf,NV,W1,mCz,wf,n5,bb,Ic,lc,Xu,qM,tk,me,oB,nh,EI,MI,Ub,kK,eW,um,Fu,QN,N9,BA,d0,zp,br,PIw,vd,uzr,Yd,kN,lZ,Gr,XE,mO,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,tL,pyk,ZD,rD,wD,Wv,yz,Fi,Ja,mj,cB,uY,yR,GK,xJ,Nn,Et,NC,nb,Zn,xt,VJ,P0,xlX,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,Eb,dT,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,qa,BQ,O,PK,JO,f0,aX,cC,RA,IY,JH,jl,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,oo,OW,Dd,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,bw,WT,jJ,XR,LI,A2,IW,F3,FD,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,dN,GT,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,bv,eS,IQ,TI,at,wu,Vc,KQ,dZ,Qe,GH,Q4,WAE,N8,Vi,kx,fx,CM,xn,vu,c2,rj,af,SI,Y2,XN,No,PG,YW,BO,Yu,y2,Hq,Pl,XK,ho,G6,Ur,j3,i0,Tg,Ps,KU,RI,Ye,CN,HT,qbd,E0,Ds,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,H6,wB,U1,SJ,SU7,Qr,w2Y,iK,GD,Sn,nI,TY,Lj,mb,am,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,U7,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,LO,dz,tK,OR,Bg,DL,b8,j7,ff,Ia,Zf,vs,da,xw,dm,rH,ZL,rq,RW,RT,jZ,FZ,OM,qh,tG,jv,LB,zn,lz,Rl,Jb,M4,Jp,h7,pr,eN,PI,uO,j4,i9,VV,Dy,lU,OC,UH,Z5,ii,ib,MO,O9,yU,nP,KA,Vo,qB,ez,ti,LV,DS,JF,ht,CR,Qk,v1y,uR,Q0,YR,fB,nO,t3,dq,lO,aY,zG,e4,JB,Id,WH,TF,K5,Cg,Hs,dv,pV,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,ey,xd,v6,db,i5,N6,Rr,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,vX,Ba,An,bF,LD,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,wI,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Rz,iP,MF,Rq,Hn,Zl,B5,a6,P7,DW,Ge,LK,AT,bJ,Np,mp,ub,ds,lj,UV,VS,t7,HG,aE,eV,kM,EH,cX,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hb,XX,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,ecX,kI,yoo,w1p,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,hP,Gm,Of,Qg,W9,vZ,dW,Dk,O7,IU,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,ac,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ob,Ip,Pg,Nb,nA,Fv,pv,E9,Vfx,m8,Gk,Urj,e5,Ni,AX,yb,oub,QR,Yx,NM,c4r,nx,jm,xj,VB,aI,rG,yh,wO,Tm,q1,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,fM,hx,Squ,PO,Vf,u7,fW,Ey,qm,vO,E7,KUl,SV,Mf,Kz,vj,tuj,LU,T2,mHk,Jq,Yn,TJ,dG,qV,HV,em,Lb,PF,Vct,fA,Qz,jA,Jo,c5,F1,aQ,D13,Ya5,WZq,Ww,pva,tz,cda,fl,qFb,oM,rna,wM,Vba,lI,waa,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,Ay,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,YJ,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w10,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,Bl,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,G0,mY,GX,mB,XF,bX,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w9,c4,z6,Ay0,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,mG,uA,vl,Li,WK,iT,ja,zw,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,cfS,JG,V0,knI,T5,fI,oaa,qq,FC,xI,Sq,nm,q2,uwf,q3,At,Sb,V2,BT,jY,H2,DO,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,XI,hs,yp,ug,DT,OB,lP,p8,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,wl,T4,TR,VD,Zt,Dsd]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/app.dart b/runtime/bin/vmservice/client/lib/app.dart
new file mode 100644
index 0000000..912e60c
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/app.dart
@@ -0,0 +1,18 @@
+library app;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+import 'dart:js';
+
+import 'package:logging/logging.dart';
+import 'package:polymer/polymer.dart';
+
+part 'src/app/application.dart';
+part 'src/app/chart.dart';
+part 'src/app/isolate.dart';
+part 'src/app/location_manager.dart';
+part 'src/app/model.dart';
+part 'src/app/service.dart';
+part 'src/app/view_model.dart';
+part 'src/app/vm.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
new file mode 100644
index 0000000..1607de3
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -0,0 +1,31 @@
+library observatory_elements;
+
+// Export elements.
+export 'package:observatory/src/elements/breakpoint_list.dart';
+export 'package:observatory/src/elements/class_ref.dart';
+export 'package:observatory/src/elements/class_view.dart';
+export 'package:observatory/src/elements/code_ref.dart';
+export 'package:observatory/src/elements/code_view.dart';
+export 'package:observatory/src/elements/collapsible_content.dart';
+export 'package:observatory/src/elements/curly_block.dart';
+export 'package:observatory/src/elements/error_view.dart';
+export 'package:observatory/src/elements/field_ref.dart';
+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/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/json_view.dart';
+export 'package:observatory/src/elements/library_ref.dart';
+export 'package:observatory/src/elements/library_view.dart';
+export 'package:observatory/src/elements/message_viewer.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/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
new file mode 100644
index 0000000..a19a572
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <link rel="import" href="src/elements/breakpoint_list.html">
+  <link rel="import" href="src/elements/class_ref.html">
+  <link rel="import" href="src/elements/class_view.html">
+  <link rel="import" href="src/elements/code_ref.html">
+  <link rel="import" href="src/elements/code_view.html">
+  <link rel="import" href="src/elements/curly_block.html">
+  <link rel="import" href="src/elements/collapsible_content.html">
+  <link rel="import" href="src/elements/disassembly_entry.html">
+  <link rel="import" href="src/elements/error_view.html">
+  <link rel="import" href="src/elements/field_ref.html">
+  <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/isolate_list.html">
+  <link rel="import" href="src/elements/isolate_summary.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">
+  <link rel="import" href="src/elements/library_ref.html">
+  <link rel="import" href="src/elements/library_view.html">
+  <link rel="import" href="src/elements/message_viewer.html">
+  <link rel="import" href="src/elements/nav_bar.html">
+  <link rel="import" href="src/elements/observatory_application.html">
+  <link rel="import" href="src/elements/observatory_element.html">
+  <link rel="import" href="src/elements/response_viewer.html">
+  <link rel="import" href="src/elements/service_ref.html">
+  <link rel="import" href="src/elements/script_ref.html">
+  <link rel="import" href="src/elements/script_view.html">
+  <link rel="import" href="src/elements/stack_frame.html">
+  <link rel="import" href="src/elements/stack_trace.html">
+</head>
+</html>
diff --git a/runtime/bin/vmservice/client/lib/observatory.dart b/runtime/bin/vmservice/client/lib/observatory.dart
deleted file mode 100644
index f82d9af..0000000
--- a/runtime/bin/vmservice/client/lib/observatory.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-library observatory;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:html';
-import 'dart:js';
-
-import 'package:logging/logging.dart';
-import 'package:polymer/polymer.dart';
-
-part 'src/observatory/application.dart';
-part 'src/observatory/chart.dart';
-part 'src/observatory/isolate.dart';
-part 'src/observatory/isolate_manager.dart';
-part 'src/observatory/location_manager.dart';
-part 'src/observatory/model.dart';
-part 'src/observatory/request_manager.dart';
-part 'src/observatory/view_model.dart';
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/observatory_elements.dart b/runtime/bin/vmservice/client/lib/observatory_elements.dart
deleted file mode 100644
index ac876de..0000000
--- a/runtime/bin/vmservice/client/lib/observatory_elements.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-library observatory_elements;
-
-// Export elements.
-export 'package:observatory/src/observatory_elements/breakpoint_list.dart';
-export 'package:observatory/src/observatory_elements/class_ref.dart';
-export 'package:observatory/src/observatory_elements/class_view.dart';
-export 'package:observatory/src/observatory_elements/code_ref.dart';
-export 'package:observatory/src/observatory_elements/code_view.dart';
-export 'package:observatory/src/observatory_elements/collapsible_content.dart';
-export 'package:observatory/src/observatory_elements/curly_block.dart';
-export 'package:observatory/src/observatory_elements/error_view.dart';
-export 'package:observatory/src/observatory_elements/field_ref.dart';
-export 'package:observatory/src/observatory_elements/field_view.dart';
-export 'package:observatory/src/observatory_elements/function_ref.dart';
-export 'package:observatory/src/observatory_elements/function_view.dart';
-export 'package:observatory/src/observatory_elements/instance_ref.dart';
-export 'package:observatory/src/observatory_elements/instance_view.dart';
-export 'package:observatory/src/observatory_elements/isolate_list.dart';
-export 'package:observatory/src/observatory_elements/isolate_summary.dart';
-export 'package:observatory/src/observatory_elements/json_view.dart';
-export 'package:observatory/src/observatory_elements/library_ref.dart';
-export 'package:observatory/src/observatory_elements/library_view.dart';
-export 'package:observatory/src/observatory_elements/message_viewer.dart';
-export 'package:observatory/src/observatory_elements/nav_bar.dart';
-export
-  'package:observatory/src/observatory_elements/observatory_application.dart';
-export 'package:observatory/src/observatory_elements/response_viewer.dart';
-export 'package:observatory/src/observatory_elements/script_ref.dart';
-export 'package:observatory/src/observatory_elements/script_view.dart';
-export 'package:observatory/src/observatory_elements/service_ref.dart';
-export 'package:observatory/src/observatory_elements/stack_frame.dart';
-export 'package:observatory/src/observatory_elements/stack_trace.dart';
diff --git a/runtime/bin/vmservice/client/lib/observatory_elements.html b/runtime/bin/vmservice/client/lib/observatory_elements.html
deleted file mode 100644
index 6ad79ce1..0000000
--- a/runtime/bin/vmservice/client/lib/observatory_elements.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <link rel="import" href="src/observatory_elements/breakpoint_list.html">
- <link rel="import" href="src/observatory_elements/class_ref.html">
- <link rel="import" href="src/observatory_elements/class_view.html">
- <link rel="import" href="src/observatory_elements/code_ref.html">
- <link rel="import" href="src/observatory_elements/code_view.html">
- <link rel="import" href="src/observatory_elements/curly_block.html">
- <link rel="import" href="src/observatory_elements/collapsible_content.html">
- <link rel="import" href="src/observatory_elements/disassembly_entry.html">
- <link rel="import" href="src/observatory_elements/error_view.html">
- <link rel="import" href="src/observatory_elements/field_ref.html">
- <link rel="import" href="src/observatory_elements/field_view.html">
- <link rel="import" href="src/observatory_elements/function_ref.html">
- <link rel="import" href="src/observatory_elements/function_view.html">
- <link rel="import" href="src/observatory_elements/isolate_list.html">
- <link rel="import" href="src/observatory_elements/isolate_summary.html">
- <link rel="import" href="src/observatory_elements/instance_ref.html">
- <link rel="import" href="src/observatory_elements/instance_view.html">
- <link rel="import" href="src/observatory_elements/json_view.html">
- <link rel="import" href="src/observatory_elements/library_ref.html">
- <link rel="import" href="src/observatory_elements/library_view.html">
- <link rel="import" href="src/observatory_elements/message_viewer.html">
- <link rel="import" href="src/observatory_elements/nav_bar.html">
- <link rel="import"
-       href="src/observatory_elements/observatory_application.html">
- <link rel="import"
-       href="src/observatory_elements/observatory_element.html">
- <link rel="import" href="src/observatory_elements/response_viewer.html">
- <link rel="import" href="src/observatory_elements/service_ref.html">
- <link rel="import" href="src/observatory_elements/script_ref.html">
- <link rel="import" href="src/observatory_elements/script_view.html">
- <link rel="import" href="src/observatory_elements/stack_frame.html">
- <link rel="import" href="src/observatory_elements/stack_trace.html">
-</head>
-</html>
diff --git a/runtime/bin/vmservice/client/lib/src/app/application.dart b/runtime/bin/vmservice/client/lib/src/app/application.dart
new file mode 100644
index 0000000..0c2c050
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/app/application.dart
@@ -0,0 +1,66 @@
+// 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.
+
+part of app;
+
+/// A request response interceptor is called for each response.
+typedef void RequestResponseInterceptor();
+
+/// The observatory application. Instances of this are created and owned
+/// by the observatory_application custom element.
+class ObservatoryApplication extends Observable {
+  @observable final LocationManager locationManager;
+  @observable final VM vm;
+  @observable Map response;
+  @observable Isolate isolate;
+
+  void setResponse(Map response) {
+    this.response = toObservable(response);
+  }
+
+  void setResponseError(String message, [String errorType = 'ResponseError']) {
+    this.response = toObservable({
+      'type': 'Error',
+      'errorType': errorType,
+      'text': message
+    });
+    Logger.root.severe(message);
+  }
+
+  void _setup() {
+    vm._app = this;
+    locationManager._app = this;
+    locationManager.init();
+  }
+
+  ObservatoryApplication.devtools() :
+      locationManager = new LocationManager(),
+      vm = new DartiumVM() {
+    _setup();
+  }
+
+  ObservatoryApplication() :
+      locationManager = new LocationManager(),
+      vm = new HttpVM('http://127.0.0.1:8181/') {
+    _setup();
+  }
+
+  static const int KB = 1024;
+  static const int MB = KB * 1024;
+  static String scaledSizeUnits(int x) {
+    if (x > 2 * MB) {
+      var y = x / MB;
+      return '${y.toStringAsFixed(1)} MB';
+    } else if (x > 2 * KB) {
+      var y = x / KB;
+      return '${y.toStringAsFixed(1)} KB';
+    }
+    var y = x.toDouble();
+    return '${y.toStringAsFixed(1)} B';
+  }
+
+  static String timeUnits(double x) {
+    return x.toStringAsFixed(2);
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/chart.dart b/runtime/bin/vmservice/client/lib/src/app/chart.dart
similarity index 99%
rename from runtime/bin/vmservice/client/lib/src/observatory/chart.dart
rename to runtime/bin/vmservice/client/lib/src/app/chart.dart
index 37204e6..77b80a1 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory/chart.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/chart.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of observatory;
+part of app;
 
 class GoogleChart {
   static var _api;
diff --git a/runtime/bin/vmservice/client/lib/src/app/isolate.dart b/runtime/bin/vmservice/client/lib/src/app/isolate.dart
new file mode 100644
index 0000000..34b649f
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/app/isolate.dart
@@ -0,0 +1,253 @@
+// 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.
+
+part of app;
+
+/// State for a running isolate.
+class Isolate extends Observable implements ServiceObject {
+  final VM vm;
+  String _id;
+  String _serviceType = 'Isolate';
+  Isolate get isolate => this;
+  String get link => _id;
+  String get id => _id;
+  String get serviceType => _serviceType;
+
+  Isolate(this.vm, this._id);
+
+  /// Refresh [this]. Returns a future which completes to [this].
+  Future refresh() {
+    return vm.fetchMap(_id).then((m) => update(m)).then((_) => this);
+  }
+
+  /// Creates a link to [objectId] relative to [this].
+  @reflectable String relativeLink(String objectId) => '$id/$objectId';
+  /// Creates a relative link to [objectId] with a '#/' prefix.
+  @reflectable String hashLink(String objectId) => '#/${relativeLink(objectId)}';
+
+  @observable Profile profile;
+  @observable final Map<String, Script> scripts =
+      toObservable(new Map<String, Script>());
+  @observable final List<Code> codes = new List<Code>();
+  @observable String name;
+  @observable String vmName;
+  @observable Map entry;
+  @observable String rootLib;
+  @observable final Map<String, double> timers =
+      toObservable(new Map<String, double>());
+
+  @observable int newHeapUsed = 0;
+  @observable int oldHeapUsed = 0;
+
+  @observable Map topFrame = null;
+  @observable String fileAndLine = null;
+
+  Isolate.fromId(this.vm, this._id) : name = 'isolate' {}
+
+  Isolate.fromMap(this.vm, Map map)
+      : _id = map['id'], name = map['name'] {
+  }
+
+  void update(Map map) {
+    if (map['type'] != 'Isolate') {
+      Logger.root.severe('Unexpected message type in Isolate.update: ${map["type"]}');
+      return;
+    }
+    if (map['rootLib'] == null ||
+        map['timers'] == null ||
+        map['heap'] == null) {
+      Logger.root.severe("Malformed 'Isolate' response: $map");
+      return;
+    }
+    rootLib = map['rootLib']['id'];
+    vmName = map['name'];
+    if (map['entry'] != null) {
+      entry = map['entry'];
+      name = entry['name'];
+    } else {
+      // fred
+      name = 'root isolate';
+    }
+    if (map['topFrame'] != null) {
+      topFrame = map['topFrame'];
+    }
+
+    var timerMap = {};
+    map['timers'].forEach((timer) {
+        timerMap[timer['name']] = timer['time'];
+      });
+    timers['total'] = timerMap['time_total_runtime'];
+    timers['compile'] = timerMap['time_compilation'];
+    timers['gc'] = 0.0;  // TODO(turnidge): Export this from VM.
+    timers['init'] = (timerMap['time_script_loading'] +
+                      timerMap['time_creating_snapshot'] +
+                      timerMap['time_isolate_initialization'] +
+                      timerMap['time_bootstrap']);
+    timers['dart'] = timerMap['time_dart_execution'];
+
+    newHeapUsed = map['heap']['usedNew'];
+    oldHeapUsed = map['heap']['usedOld'];
+  }
+
+  String toString() => '$id';
+
+  Code findCodeByAddress(int address) {
+    for (var i = 0; i < codes.length; i++) {
+      if (codes[i].contains(address)) {
+        return codes[i];
+      }
+    }
+    return null;
+  }
+
+  Code findCodeByName(String name) {
+    for (var i = 0; i < codes.length; i++) {
+      if (codes[i].name == name) {
+        return codes[i];
+      }
+    }
+    return null;
+  }
+
+  void resetCodeTicks() {
+    Logger.root.info('Reset all code ticks.');
+    for (var i = 0; i < codes.length; i++) {
+      codes[i].resetTicks();
+    }
+  }
+
+  void updateCoverage(List coverages) {
+    for (var coverage in coverages) {
+      var id = coverage['script']['id'];
+      var script = scripts[id];
+      if (script == null) {
+        script = new Script.fromMap(coverage['script']);
+        scripts[id] = script;
+      }
+      assert(script != null);
+      script._processCoverageHits(coverage['hits']);
+    }
+  }
+
+  // TODO(johnmccutchan): Remove this once everything is a ServiceObject.
+  void _setModelResponse(String type, String modelName, dynamic model) {
+    var response = {
+      'type': type,
+      modelName: model
+    };
+    vm.app.setResponse(response);
+  }
+
+  void _setResponseRequestError(HttpRequest request) {
+     String error = '${request.status} ${request.statusText}';
+     if (request.status == 0) {
+       error = 'No service found. Did you run with --enable-vm-service ?';
+     }
+     vm.app.setResponseError(error, 'RequestError');
+   }
+
+  void _requestCatchError(e, st) {
+     if (e is ProgressEvent) {
+       _setResponseRequestError(e.target);
+     } else {
+       vm.app.setResponseError('$e $st');
+     }
+   }
+
+  static final RegExp _codeMatcher = new RegExp(r'/code/');
+  static bool isCodeId(objectId) => _codeMatcher.hasMatch(objectId);
+  static int codeAddressFromRequest(String objectId) {
+    Match m = _codeMatcher.matchAsPrefix(objectId);
+    if (m == null) {
+      return 0;
+    }
+    try {
+      var a = int.parse(m.input.substring(m.end), radix: 16);
+      return a;
+    } catch (e) {
+      return 0;
+    }
+  }
+
+  /// Handle 'Code' requests
+  void _getCode(String objectId) {
+    var address = codeAddressFromRequest(objectId);
+    if (address == 0) {
+      vm.app.setResponseError('$objectId is not a valid code request.');
+      return;
+    }
+    var code = isolate.findCodeByAddress(address);
+    if (code != null) {
+      Logger.root.info(
+          'Found code with 0x${address.toRadixString(16)} in isolate.');
+      _setModelResponse('Code', 'code', code);
+      return;
+    }
+    getMap(objectId).then((map) {
+      assert(map['type'] == 'Code');
+      var code = new Code.fromMap(map);
+      Logger.root.info(
+          'Added code with 0x${address.toRadixString(16)} to isolate.');
+      isolate.codes.add(code);
+      _setModelResponse('Code', 'code', code);
+    }).catchError(_requestCatchError);
+  }
+
+  static final RegExp _scriptMatcher = new RegExp(r'scripts/.+');
+  static bool isScriptId(objectId) => _scriptMatcher.hasMatch(objectId);
+  void _getScript(String objectId) {
+    var script = scripts[objectId];
+    if ((script != null) && !script.needsSource) {
+      Logger.root.info('Found script ${script.scriptRef['name']} in isolate');
+      _setModelResponse('Script', 'script', script);
+      return;
+    }
+    if (script != null) {
+      // The isolate has the script but no script source code.
+      getMap(objectId).then((response) {
+        assert(response['type'] == 'Script');
+        script._processSource(response['source']);
+        Logger.root.info(
+            'Grabbed script ${script.scriptRef['name']} source.');
+        _setModelResponse('Script', 'script', script);
+      });
+      return;
+    }
+    // New script.
+    getMap(objectId).then((response) {
+      assert(response['type'] == 'Script');
+      var script = new Script.fromMap(response);
+      Logger.root.info(
+          'Added script ${script.scriptRef['name']} to isolate.');
+      _setModelResponse('Script', 'script', script);
+      scripts[objectId] = script;
+    });
+  }
+
+  /// Requests [objectId] from [this]. Completes to a [ServiceObject].
+  Future<ServiceObject> get(String objectId) {
+    if (isCodeId(objectId)) {
+      _getCode(objectId);
+      // TODO(johnmccutchan): FIX.
+      return null;
+    }
+    if (isScriptId(objectId)) {
+      _getScript(objectId);
+      // TODO(johnmccutchan): FIX.
+      return null;
+    }
+    return vm.fetchMap(relativeLink(objectId)).then((m) =>
+        upgradeToServiceObject(objectId, m));
+  }
+
+  /// Requests [objectId] from [this]. Completes to a [Map].
+  Future<ObservableMap> getMap(String objectId) {
+    return vm.fetchMap(relativeLink(objectId));
+  }
+
+  /// Upgrades response ([m]) for [objectId] to a [ServiceObject].
+  ServiceObject upgradeToServiceObject(String objectId, Map m) {
+    return new ServiceMap.fromMap(this, m);
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
similarity index 68%
rename from runtime/bin/vmservice/client/lib/src/observatory/location_manager.dart
rename to runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index 2b7c409..29fc074 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of observatory;
+part of app;
 
 /// The LocationManager class observes and parses the hash ('#') portion of the
 /// URL in window.location. The text after the '#' is used as the request
@@ -11,11 +11,9 @@
   static const int InvalidIsolateId = 0;
   static const String defaultHash = '#/isolates/';
   static final RegExp currentIsolateMatcher = new RegExp(r"#/isolates/\d+");
-  static final RegExp currentIsolateProfileMatcher =
-      new RegExp(r'#/isolates/\d+/profile');
 
-  ObservatoryApplication _application;
-  ObservatoryApplication get application => _application;
+  ObservatoryApplication _app;
+  ObservatoryApplication get app => _app;
 
   @observable bool profile = false;
   @observable String currentHash = '';
@@ -49,6 +47,15 @@
     return m.input.substring(m.start, m.end);
   }
 
+  /// Returns the current object id.
+  String currentObjectId() {
+    Match m = currentIsolateMatcher.matchAsPrefix(currentHash);
+    if (m == null) {
+      return null;
+    }
+    return m.input.substring(m.end);
+  }
+
   /// Predicate, does the current URL have a current isolate ID in it?
   @observable bool get hasCurrentIsolate {
     return currentIsolateAnchorPrefix() != null;
@@ -65,12 +72,13 @@
     return prefix.substring(2);
   }
 
+  /// Returns the current isolate.
   @observable Isolate currentIsolate() {
     var id = currentIsolateId();
     if (id == '') {
       return null;
     }
-    return _application.isolateManager.getIsolate(id);
+    return app.vm.getIsolate(id);
   }
 
   /// If no anchor is set, set the default anchor and return true.
@@ -90,42 +98,17 @@
     currentHash = window.location.hash;
     // Chomp off the #
     String requestUrl = currentHash.substring(1);
+    app.isolate = currentIsolate();
     currentHashUri = Uri.parse(requestUrl);
-    if (currentIsolateProfileMatcher.hasMatch(currentHash)) {
-      // We do not automatically fetch profile data.
-      profile = true;
-    } else {
-      application.requestManager.get(requestUrl);
-      profile = false;
+    if (app.isolate == null) {
+      Logger.root.warning('Refreshing isolates.');
+      app.vm.refreshIsolates();
+      return;
     }
-  }
-
-  /// Create a request for [l] on the current isolate.
-  @observable
-  String currentIsolateRelativeLink(String l) {
-    var isolateId = currentIsolateId();
-    if (isolateId == LocationManager.InvalidIsolateId) {
-      return defaultHash;
-    }
-    return relativeLink(isolateId, l);
-  }
-
-  /// Create a request for [scriptURL] on the current isolate.
-  @observable
-  String currentIsolateScriptLink(String scriptURL) {
-    var encoded = Uri.encodeComponent(scriptURL);
-    return currentIsolateRelativeLink('scripts/$encoded');
-  }
-
-  /// Create a request for [l] on [isolateId].
-  @observable
-  String relativeLink(String isolateId, String l) {
-    return '#/$isolateId/$l';
-  }
-
-  /// Create a request for [l] on [isolateId].
-  @observable
-  String absoluteLink(String l) {
-    return '#/$l';
+    var objectId = currentObjectId();
+    Logger.root.info('Asking ${app.isolate.id} for ${objectId}');
+    app.isolate.get(objectId).then((so) {
+      app.response = so;
+    });
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/model.dart b/runtime/bin/vmservice/client/lib/src/app/model.dart
similarity index 99%
rename from runtime/bin/vmservice/client/lib/src/observatory/model.dart
rename to runtime/bin/vmservice/client/lib/src/app/model.dart
index 4d0545ae..ddca7c8 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory/model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/model.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of observatory;
+part of app;
 
 class CodeInstruction extends Observable {
   @observable final int address;
diff --git a/runtime/bin/vmservice/client/lib/src/app/service.dart b/runtime/bin/vmservice/client/lib/src/app/service.dart
new file mode 100644
index 0000000..c82182e
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/app/service.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.
+
+part of app;
+
+/// A [ServiceObject] is an object known to the VM service and is tied
+/// to an owning [Isolate].
+abstract class ServiceObject extends Observable {
+  /// Owning isolate.
+  final Isolate isolate;
+  /// The complete service url of this object.
+  String get link => isolate.relativeLink(_id);
+  String _id;
+  /// The id of this object.
+  String get id => _id;
+  String _serviceType;
+  /// The service type of this object.
+  String get serviceType => _serviceType;
+
+  /// Refresh [this]. Returns a future which completes to [this].
+  Future refresh();
+
+  ServiceObject(this.isolate, this._id, this._serviceType);
+}
+
+
+/// A [ServiceObject] which implements [Map].
+class ServiceMap extends ServiceObject implements Map {
+  final Map _map = new ObservableMap();
+
+  ServiceMap(Isolate isolate, String id, String serviceType) :
+      super(isolate, id, serviceType) {
+  }
+
+  ServiceMap.fromMap(Isolate isolate, Map m) :
+      super(isolate, m['id'], m['type']) {
+    _fill(m);
+  }
+
+  Future refresh() {
+    isolate.getMap(_id).then(_fill);
+    return new Future.value(this);
+  }
+
+  void _fill(Map m) {
+    _map.clear();
+    _map.addAll(m);
+    // TODO(johnmccutchan): Recursively promote all contained Maps to
+    // ServiceMaps if they have a 'type' key.
+  }
+
+  // Implement Map by forwarding methods to _map.
+  void addAll(Map other) => _map.addAll(other);
+  void clear() => _map.clear();
+  bool containsValue(v) => _map.containsValue(v);
+  bool containsKey(k) => _map.containsKey(k);
+  void forEach(Function f) => _map.forEach(f);
+  putIfAbsent(key, Function ifAbsent) => _map.putIfAbsent(key, ifAbsent);
+  void remove(key) => _map.remove(key);
+  operator [](k) => _map[k];
+  operator []=(k, v) => _map[k] = v;
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+  Iterable get keys => _map.keys;
+  Iterable get values => _map.values;
+  int get length => _map.length;
+}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
similarity index 98%
rename from runtime/bin/vmservice/client/lib/src/observatory/view_model.dart
rename to runtime/bin/vmservice/client/lib/src/app/view_model.dart
index 302f824..e832dca 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of observatory;
+part of app;
 
 abstract class TableTreeRow extends Observable {
   final TableTreeRow parent;
diff --git a/runtime/bin/vmservice/client/lib/src/app/vm.dart b/runtime/bin/vmservice/client/lib/src/app/vm.dart
new file mode 100644
index 0000000..3002912
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/app/vm.dart
@@ -0,0 +1,127 @@
+// 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 app;
+
+abstract class VM extends Observable {
+  @observable ObservatoryApplication get app => _app;
+  ObservatoryApplication _app;
+
+  Future<String> fetchString(String path);
+
+  Future<ObservableMap> fetchMap(String path) {
+    return fetchString(path).then((response) {
+      try {
+        var map = JSON.decode(response);
+        return toObservable(map);
+      } catch (e, st) {
+        return toObservable({
+          'type': 'Error',
+          'errorType': 'DecodeError',
+          'text': '$e $st'
+        });
+      }
+    }).catchError((error) {
+      return toObservable({
+        'type': 'Error',
+        'errorType': 'FetchError',
+        'text': '$error'
+      });
+    });
+  }
+
+  @observable final ObservableMap isolates = new ObservableMap();
+  Isolate getIsolate(String id) {
+    var isolate = isolates[id];
+    if (isolate != null) {
+      return isolate;
+    }
+    isolate = new Isolate.fromId(this, id);
+    isolates[id] = isolate;
+    return isolate;
+  }
+
+  static bool _foundIsolateInMembers(String id, List<Map> members) {
+    return members.any((E) => E['id'] == id);
+  }
+
+  void _updateIsolates(List<Map> members) {
+    // Find dead isolates.
+    var deadIsolates = [];
+    isolates.forEach((k, v) {
+      if (!_foundIsolateInMembers(k, members)) {
+        deadIsolates.add(k);
+      }
+    });
+    // Remove them.
+    deadIsolates.forEach((id) {
+      isolates.remove(id);
+    });
+    // Add new isolates.
+    members.forEach((map) {
+      var id = map['id'];
+      var isolate = isolates[id];
+      if (isolate == null) {
+        isolate = new Isolate.fromMap(this, map);
+        isolates[id] = isolate;
+      }
+      isolate.refresh();
+    });
+  }
+
+  void refreshIsolates() {
+    fetchMap('isolates').then((map) {
+      assert(map['type'] == 'IsolateList');
+      _updateIsolates(map['members']);
+      app.setResponse(map);
+    });
+  }
+}
+
+
+class HttpVM extends VM {
+  final String address;
+  HttpVM(this.address);
+
+  Future<String> fetchString(String path) {
+    Logger.root.info('Fetching $path from $address');
+    return HttpRequest.getString(address + path);
+  }
+}
+
+class DartiumVM extends VM {
+  final Map _outstandingRequests = new Map();
+  int _requestSerial = 0;
+
+  DartiumVM() {
+    window.onMessage.listen(_messageHandler);
+    print('Connected to DartiumVM');
+  }
+
+  void _messageHandler(msg) {
+    var id = msg.data['id'];
+    var name = msg.data['name'];
+    var data = msg.data['data'];
+    if (name != 'observatoryData') {
+      return;
+    }
+    var completer = _outstandingRequests[id];
+    assert(completer != null);
+    _outstandingRequests.remove(id);
+    completer.complete(data);
+  }
+
+  Future<String> fetchString(String path) {
+    var idString = '$_requestSerial';
+    Map message = {};
+    message['id'] = idString;
+    message['method'] = 'observatoryQuery';
+    message['query'] = '/$path';
+    _requestSerial++;
+    var completer = new Completer();
+    _outstandingRequests[idString] = completer;
+    window.parent.postMessage(JSON.encode(message), '*');
+    return completer.future;
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/breakpoint_list.dart b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart
similarity index 62%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/breakpoint_list.dart
rename to runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart
index 5b8b1a1..7a3f55b 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/breakpoint_list.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart
@@ -4,22 +4,22 @@
 
 library breakpoint_list_element;
 
-import 'observatory_element.dart';
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
 
+// TODO(turnidge): Is a breakpoint list associated with a VM or an isolate?
 @CustomTag('breakpoint-list')
-class BreakpointListElement extends ObservatoryElement {
+class BreakpointListElement extends IsolateElement {
   @published Map msg = toObservable({});
 
   BreakpointListElement.created() : super.created();
 
   void refresh(var done) {
-    var url = app.locationManager.currentIsolateRelativeLink("breakpoints");
-    app.requestManager.requestMap(url).then((map) {
-        msg = map;
+    isolate.getMap('breakpoints').then((map) {
+      msg = map;
     }).catchError((e, trace) {
-          Logger.root.severe('Error while refreshing breakpoint-list: $e\n$trace');
+      Logger.root.severe('Error while refreshing breakpoint-list: $e\n$trace');
     }).whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
similarity index 76%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/breakpoint_list.html
rename to runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 99136af..3785531 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -1,13 +1,12 @@
 <head>
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="isolate_element.html">
 </head>
-<polymer-element name="breakpoint-list" extends="observatory-element">
+<polymer-element name="breakpoint-list" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/class_ref.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/class_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/class_ref.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_ref.html b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/class_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/class_ref.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
similarity index 74%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index d8bea9b..bfdc050 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -4,18 +4,17 @@
 
 library class_view_element;
 
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 @CustomTag('class-view')
-class ClassViewElement extends ObservatoryElement {
+class ClassViewElement extends IsolateElement {
   @published Map cls;
   ClassViewElement.created() : super.created();
 
   void refresh(var done) {
-    var url = app.locationManager.currentIsolateRelativeLink(cls['id']);
-    app.requestManager.requestMap(url).then((map) {
+    isolate.getMap(cls['id']).then((map) {
         cls = map;
     }).catchError((e, trace) {
         Logger.root.severe('Error while refreshing class-view: $e\n$trace');
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
similarity index 87%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 65afc6c..cc906b2 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -5,16 +5,15 @@
   <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="isolate_element.html">
 </head>
-<polymer-element name="class-view" extends="observatory-element">
+<polymer-element name="class-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <library-nav-menu app="{{ app }}" library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu app="{{ app }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <library-nav-menu isolate="{{ isolate }}" library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu isolate="{{ isolate }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/code_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/code_ref.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/code_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/code_ref.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/code_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/code_ref.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/code_view.dart b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
similarity index 77%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/code_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/code_view.dart
index 437882b..884241b 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/code_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
@@ -4,12 +4,12 @@
 
 library code_view_element;
 
+import 'isolate_element.dart';
 import 'package:polymer/polymer.dart';
-import 'package:observatory/observatory.dart';
-import 'observatory_element.dart';
+import 'package:observatory/app.dart';
 
 @CustomTag('code-view')
-class CodeViewElement extends ObservatoryElement {
+class CodeViewElement extends IsolateElement {
   @published Code code;
   CodeViewElement.created() : super.created();
 
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
similarity index 77%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/code_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/code_view.html
index d4ed7d9..c2fee73 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,15 +1,14 @@
 <head>
   <link rel="import" href="disassembly_entry.html">
   <link rel="import" href="function_ref.html">
+  <link rel="import" href="isolate_element.html">
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="code-view" extends="observatory-element">
+<polymer-element name="code-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="{{ code.functionRef['user_name'] }}" last="{{ true }}"></nav-menu>
       <!-- TODO(turnidge): Implement code refresh -->
     </nav-bar>
@@ -18,7 +17,7 @@
     <div class="col-md-8 col-md-offset-2">
       <div class="{{ cssPanelClass }}">
         <div class="panel-heading">
-          <function-ref app="{{ app }}" ref="{{ code.functionRef }}"></function-ref>
+          <function-ref isolate="{{ isolate }}" ref="{{ code.functionRef }}"></function-ref>
         </div>
         <div class="panel-body">
           <div class="row">
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/collapsible_content.dart b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/collapsible_content.dart
rename to runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/collapsible_content.html b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/collapsible_content.html
rename to runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/curly_block.dart b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
similarity index 95%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/curly_block.dart
rename to runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
index 8317efc..4b32108 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/curly_block.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
@@ -4,7 +4,6 @@
 
 library curly_block_element;
 
-import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('curly-block')
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/curly_block.html b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/curly_block.html
rename to runtime/bin/vmservice/client/lib/src/elements/curly_block.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/disassembly_entry.dart b/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.dart
similarity index 91%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/disassembly_entry.dart
rename to runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.dart
index 72f618b..751dada 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/disassembly_entry.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.dart
@@ -4,7 +4,7 @@
 
 library disassembly_entry_element;
 
-import 'package:observatory/observatory.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 import 'observatory_element.dart';
 
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/disassembly_entry.html b/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/disassembly_entry.html
rename to runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.dart b/runtime/bin/vmservice/client/lib/src/elements/error_view.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/error_view.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/error_view.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/field_ref.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/field_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/field_ref.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
similarity index 93%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/field_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index 8f0b3e5..69a4754 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -1,5 +1,6 @@
 <head>
 <link rel="import" href="class_ref.html">
+<link rel="import" href="isolate_element.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
 </head>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_view.dart b/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
similarity index 74%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/field_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/field_view.dart
index ea6e704..6fa83e7 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
@@ -4,18 +4,17 @@
 
 library field_view_element;
 
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 @CustomTag('field-view')
-class FieldViewElement extends ObservatoryElement {
+class FieldViewElement extends IsolateElement {
   @published Map field;
   FieldViewElement.created() : super.created();
 
   void refresh(var done) {
-    var url = app.locationManager.currentIsolateRelativeLink(field['id']);
-    app.requestManager.requestMap(url).then((map) {
+    isolate.getMap(field['id']).then((map) {
         field = map;
     }).catchError((e, trace) {
         Logger.root.severe('Error while refreshing field-view: $e\n$trace');
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
similarity index 80%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/field_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 1925dcb..1c591ca 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -3,18 +3,17 @@
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <template if="{{ field['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu app="{{ app }}" cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu isolate="{{ isolate }}" cls="{{ field['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ field['owner']['type'] == '@Library' }}">
-        <library-nav-menu app="{{ app }}" library="{{ field['owner'] }}"></library-nav-menu>
+        <library-nav-menu isolate="{{ isolate }}" library="{{ field['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -28,7 +27,7 @@
           <template if="{{ field['final'] }}">final</template>
           <template if="{{ field['const'] }}">const</template>
           {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref app="{{ app }}" ref="{{ field['class'] }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ field['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
         <template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -47,7 +46,7 @@
             </div>
           </template>
           <blockquote>
-            <class-ref app="{{ app }}" ref="{{ field['guard_class'] }}"></class-ref>
+            <class-ref isolate="{{ isolate }}" ref="{{ field['guard_class'] }}"></class-ref>
           </blockquote>
         </template>
         </div>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/function_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/function_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/function_ref.html b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/function_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/function_ref.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/function_view.dart b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
similarity index 73%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/function_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/function_view.dart
index dbcb66f..5119a7e 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/function_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
@@ -4,18 +4,18 @@
 
 library function_view_element;
 
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
+
 
 @CustomTag('function-view')
-class FunctionViewElement extends ObservatoryElement {
+class FunctionViewElement extends IsolateElement {
   @published Map function;
   FunctionViewElement.created() : super.created();
 
   void refresh(var done) {
-    var url = app.locationManager.currentIsolateRelativeLink(function['id']);
-    app.requestManager.requestMap(url).then((map) {
+    isolate.getMap(function['id']).then((map) {
         function = map;
     }).catchError((e, trace) {
         Logger.root.severe('Error while refreshing field-view: $e\n$trace');
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
similarity index 75%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/function_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/function_view.html
index a89ce85..9a2af8b 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -1,21 +1,20 @@
 <head>
   <link rel="import" href="class_ref.html">
   <link rel="import" href="code_ref.html">
+  <link rel="import" href="isolate_element.html">
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="function-view" extends="observatory-element">
+<polymer-element name="function-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <template if="{{ function['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu app="{{ app }}" cls="{{ function['owner'] }}"></class-nav-menu>
+        <class-nav-menu isolate="{{ isolate }}" cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ function['owner']['type'] == '@Library' }}">
-        <library-nav-menu app="{{ app }}" library="{{ function['owner'] }}"></library-nav-menu>
+        <library-nav-menu isolate="{{ isolate }}" library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -26,12 +25,12 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
           {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref app="{{ app }}" ref="{{ function['class'] }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ function['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <div>
-          <code-ref app="{{ app }}" ref="{{ function['code'] }}"></code-ref>
-          <code-ref app="{{ app }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
+          <code-ref isolate="{{ isolate }}" ref="{{ function['code'] }}"></code-ref>
+          <code-ref isolate="{{ isolate }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
           </div>
           <table class="table table-hover">
             <tbody>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
similarity index 91%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/heap_profile.dart
rename to runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index e281a07..b7c6063 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -5,13 +5,14 @@
 library heap_profile_element;
 
 import 'dart:html';
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
+import 'package:observatory/app.dart';
 
 /// Displays an Error response.
 @CustomTag('heap-profile')
-class HeapProfileElement extends ObservatoryElement {
+class HeapProfileElement extends IsolateElement {
   // Indexes into VM provided map.
   static const ALLOCATED_BEFORE_GC = 0;
   static const ALLOCATED_BEFORE_GC_SIZE = 1;
@@ -105,8 +106,7 @@
         continue;
       }
       var vm_name = cls['class']['name'];
-      var url =
-          app.locationManager.currentIsolateRelativeLink(cls['class']['id']);
+      var url = isolate.relativeLink(cls['class']['id']);
       _fullDataTable.addRow([
           '<a title="$vm_name" href="$url">'
           '${_fullTableColumnValue(cls, 0)}</a>',
@@ -223,14 +223,7 @@
   }
 
   void refresh(var done) {
-    var isolateId = app.locationManager.currentIsolateId();
-    var isolate = app.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      Logger.root.info('No isolate found.');
-      return;
-    }
-    var request = '/$isolateId/allocationprofile';
-    app.requestManager.requestMap(request).then((Map response) {
+    isolate.getMap('/allocationprofile').then((Map response) {
       assert(response['type'] == 'AllocationProfile');
       profile = response;
     }).catchError((e, st) {
@@ -239,14 +232,7 @@
   }
 
   void resetAccumulator(Event e, var detail, Node target) {
-    var isolateId = app.locationManager.currentIsolateId();
-    var isolate = app.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      Logger.root.info('No isolate found.');
-      return;
-    }
-    var request = '/$isolateId/allocationprofile/reset';
-    app.requestManager.requestMap(request).then((Map response) {
+    isolate.getMap('/allocationprofile/reset').then((Map response) {
       assert(response['type'] == 'AllocationProfile');
       profile = response;
     }).catchError((e, st) {
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
similarity index 89%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/heap_profile.html
rename to runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index 196427f..624bd27 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -1,14 +1,13 @@
 <head>
   <link rel="import" href="class_ref.html">
+  <link rel="import" href="isolate_element.html">
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="heap-profile" extends="observatory-element">
+<polymer-element name="heap-profile" extends="isolate-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-    </isolate-nav-menu>
+    <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
     <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/img/isolate_icon.png b/runtime/bin/vmservice/client/lib/src/elements/img/isolate_icon.png
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/img/isolate_icon.png
rename to runtime/bin/vmservice/client/lib/src/elements/img/isolate_icon.png
Binary files differ
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
new file mode 100644
index 0000000..a256472
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
@@ -0,0 +1,73 @@
+// 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 instance_ref_element;
+
+import 'package:logging/logging.dart';
+import 'package:polymer/polymer.dart';
+import 'service_ref.dart';
+
+@CustomTag('instance-ref')
+class InstanceRefElement extends ServiceRefElement {
+  InstanceRefElement.created() : super.created();
+
+  String get name {
+    if (ref == null) {
+      return super.name;
+    }
+    return ref['preview'];
+  }
+
+  String get hoverText {
+    if (ref != null) {
+      if (ref['type'] == '@Null') {
+        if (ref['id'] == 'objects/optimized-out') {
+          return 'This object is no longer needed and has been removed by the optimizing compiler.';
+        } else if (ref['id'] == 'objects/collected') {
+          return 'This object has been reclaimed by the garbage collector.';
+        } else if (ref['id'] == 'objects/expired') {
+          return 'The handle to this object has expired.  Consider refreshing the page.';
+        } else if (ref['id'] == 'objects/not-initialized') {
+          return 'This object will be initialized once it is accessed by the program.';
+        } else if (ref['id'] == 'objects/being-initialized') {
+          return 'This object is currently being initialized.';
+        }
+      }
+    }
+    return '';
+  }
+
+  // TODO(turnidge): This is here to workaround vm/dart2js differences.
+  dynamic expander() {
+    return expandEvent;
+  }
+
+  void expandEvent(bool expand, var done) {
+    print("Calling expandEvent");
+    if (expand) {
+      isolate.getMap(objectId).then((map) {
+          if (map['type'] == 'Null') {
+            // The object is no longer available.  For example, the
+            // object id may have expired or the object may have been
+            // collected by the gc.
+            map['type'] = '@Null';
+            ref = map;
+          } else {
+            ref['fields'] = map['fields'];
+            ref['elements'] = map['elements'];
+            ref['length'] = map['length'];
+          }
+        ref['fields'] = map['fields'];
+        ref['elements'] = map['elements'];
+        ref['length'] = map['length'];
+      }).catchError((e, trace) {
+          Logger.root.severe('Error while expanding instance-ref: $e\n$trace');
+      }).whenComplete(done);
+    } else {
+      ref['fields'] = null;
+      ref['elements'] = null;
+      done();
+    }
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
similarity index 88%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/instance_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index 05beb9e..a2ed2c4 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -17,7 +17,7 @@
       </template>
 
       <template if="{{ isNullRef(ref['type']) }}">
-        {{ name }}
+        <div title="{{ hoverText }}">{{ name }}</div>
       </template>
 
       <template if="{{ (isStringRef(ref['type']) ||
@@ -39,7 +39,7 @@
             <tr template repeat="{{ field in ref['fields'] }}">
               <td class="member">{{ field['decl']['user_name'] }}</td>
               <td class="member">
-                <instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref>
               </td>
             </tr>
           </table>
@@ -53,7 +53,7 @@
             <tr template repeat="{{ element in ref['elements'] }}">
               <td class="member">[{{ element['index']}}]</td>
               <td class="member">
-                <instance-ref app="{{ app }}" ref="{{ element['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ element['value'] }}"></instance-ref>
               </td>
             </tr>
           </table>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
similarity index 81%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/instance_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index 444b8ce..fb7fcd1 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -4,11 +4,11 @@
 
 library instance_view_element;
 
+import 'isolate_element.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 @CustomTag('instance-view')
-class InstanceViewElement extends ObservatoryElement {
+class InstanceViewElement extends IsolateElement {
   @published Map instance;
   InstanceViewElement.created() : super.created();
 }
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
similarity index 72%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/instance_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 7230481..813b4ad 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -3,17 +3,16 @@
   <link rel="import" href="error_view.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="instance_ref.html">
+  <link rel="import" href="isolate_element.html">
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="instance-view" extends="observatory-element">
+<polymer-element name="instance-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <!-- TODO(turnidge): Add library nav menu here. -->
-      <class-nav-menu app="{{ app }}" cls="{{ instance['class'] }}"></class-nav-menu>
+      <class-nav-menu isolate="{{ isolate }}" cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
       <!-- TODO(turnidge): Add nav refresh here. -->
     </nav-bar>
@@ -23,7 +22,7 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
          Instance of
-         <class-ref app="{{ app }}" ref="{{ instance['class'] }}"></class-ref>
+         <class-ref isolate="{{ isolate }}" ref="{{ instance['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <template if="{{ instance['error'] == null }}">
@@ -38,8 +37,8 @@
             <table class="table table-hover">
              <tbody>
                 <tr template repeat="{{ field in instance['fields'] }}">
-                  <td><field-ref app="{{ app }}" ref="{{ field['decl'] }}"></field-ref></td>
-                  <td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
+                  <td><field-ref isolate="{{ isolate }}" ref="{{ field['decl'] }}"></field-ref></td>
+                  <td><instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref></td>
                 </tr>
               </tbody>
             </table>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_element.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_element.dart
new file mode 100644
index 0000000..8b906e5
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_element.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library isolate_element;
+
+import 'package:observatory/app.dart';
+import 'package:polymer/polymer.dart';
+import 'observatory_element.dart';
+
+/// Base class for all custom elements which reference an isolate.
+/// Holds an observable [Isolate].
+@CustomTag('isolate-element')
+class IsolateElement extends ObservatoryElement {
+  IsolateElement.created() : super.created();
+  @published Isolate isolate;
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_element.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_element.html
new file mode 100644
index 0000000..696ccf1
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_element.html
@@ -0,0 +1,6 @@
+<head>
+  <link rel="import" href="observatory_element.html">
+</head>
+<polymer-element name="isolate-element" extends="observatory-element">
+  <script type="application/dart" src="isolate_element.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_list.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart
similarity index 77%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_list.dart
rename to runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart
index 76a1717..5b6ffea 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_list.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart
@@ -4,19 +4,18 @@
 
 library isolate_list_element;
 
+import 'vm_element.dart';
 import 'dart:async';
-import 'dart:html';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 /// Displays an IsolateList response.
 @CustomTag('isolate-list')
-class IsolateListElement extends ObservatoryElement {
+class IsolateListElement extends VMElement {
   IsolateListElement.created() : super.created();
-  
+
   void refresh(var done) {
     var futures = [];
-    app.isolateManager.isolates.forEach((id, isolate) {
+    vm.isolates.forEach((id, isolate) {
        futures.add(isolate.refresh());
     });
     Future.wait(futures).then((_) => done());
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_list.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.html
similarity index 64%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_list.html
rename to runtime/bin/vmservice/client/lib/src/elements/isolate_list.html
index 4ba897b..0a817d1 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.html
@@ -1,8 +1,9 @@
 <head>
   <link rel="import" href="isolate_summary.html">
   <link rel="import" href="nav_bar.html">
+  <link rel="import" href="vm_element.html">
 </head>
-<polymer-element name="isolate-list" extends="observatory-element">
+<polymer-element name="isolate-list" extends="vm-element">
   <template>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10,13 +11,12 @@
       <nav-refresh callback="{{ refresh } }}"></nav-refresh>
     </nav-bar>
       <ul class="list-group">
-      <template repeat="{{ isolate in app.isolateManager.isolates.values }}">
+      <template repeat="{{ isolate in vm.isolates.values }}">
       	<li class="list-group-item">
-        <isolate-summary app="{{ app }}" isolate="{{ isolate }}"></isolate-summary>
+        <isolate-summary isolate="{{ isolate }}"></isolate-summary>
         </li>
       </template>
       </ul>
-      (<a href="{{ app.locationManager.absoluteLink('cpu') }}">cpu</a>)
   </template>
   <script type="application/dart" src="isolate_list.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
similarity index 78%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart
rename to runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index eff6f8d..8a2961b 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -5,10 +5,10 @@
 library isolate_profile_element;
 
 import 'dart:html';
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
-import 'package:observatory/observatory.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 class ProfileCallerTreeRow extends TableTreeRow {
   final Isolate isolate;
@@ -55,62 +55,51 @@
 
 /// Displays an IsolateProfile
 @CustomTag('isolate-profile')
-class IsolateProfileElement extends ObservatoryElement {
+class IsolateProfileElement extends IsolateElement {
   IsolateProfileElement.created() : super.created();
   @observable int methodCountSelected = 0;
   final List methodCounts = [10, 20, 50];
   @observable List topExclusiveCodes = toObservable([]);
   final _id = '#tableTree';
   TableTree tree;
+  @published Map profile;
+  @observable String sampleCount = '';
+  @observable String refreshTime = '';
 
-  void enteredView() {
-    var isolateId = app.locationManager.currentIsolateId();
-    var isolate = app.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
+  void profileChanged(oldValue) {
+    if (profile == null) {
       return;
     }
+    print('profile changed');
+    var samples = profile['samples'];
+    _loadProfileData(isolate, samples, profile);
+    _refresh(isolate);
+  }
+
+  void enteredView() {
     tree = new TableTree(['Method', 'Exclusive', 'Caller', 'Inclusive']);
     _refresh(isolate);
   }
 
-  void _startRequest() {
-    // TODO(johnmccutchan): Indicate visually.
-  }
-
-  void _endRequest() {
-    // TODO(johnmccutchan): Indicate visually.
-  }
-
   methodCountSelectedChanged(oldValue) {
-    var isolateId = app.locationManager.currentIsolateId();
-    var isolate = app.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      return;
-    }
     _refresh(isolate);
   }
 
   void refresh(var done) {
-    var isolateId = app.locationManager.currentIsolateId();
-    var isolate = app.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      Logger.root.info('No isolate found.');
-      return;
-    }
-    var request = '/$isolateId/profile';
-    _startRequest();
-    app.requestManager.requestMap(request).then((Map profile) {
+    isolate.getMap('profile').then((Map profile) {
       assert(profile['type'] == 'Profile');
       var samples = profile['samples'];
       Logger.root.info('Profile contains ${samples} samples.');
       _loadProfileData(isolate, samples, profile);
-      _endRequest();
-    }).catchError((e) {
-      _endRequest();
+    }).catchError((e, st) {
+      Logger.root.warning('Error refreshing profile', e, st);
     }).whenComplete(done);
   }
 
   void _loadProfileData(Isolate isolate, int totalSamples, Map response) {
+    sampleCount = totalSamples.toString();
+    var now = new DateTime.now();
+    refreshTime = now.toString();
     isolate.profile = new Profile.fromMap(isolate, response);
     _refresh(isolate);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
similarity index 62%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.html
rename to runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index 0fbce1c..7d2fe1a 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -3,22 +3,27 @@
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="isolate-profile" extends="observatory-element">
+<polymer-element name="isolate-profile" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-
-    <div>
-      <span>Top</span>
-      <select selectedIndex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-        <option template repeat="{{count in methodCounts}}">{{count}}</option>
-      </select>
-      <span>exclusive methods</span>
+    <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>
@@ -34,7 +39,7 @@
           <td on-click="{{toggleExpanded}}"
               class="{{ coloring(row) }}"
               style="{{ padding(row) }}">
-            <code-ref app="{{ app }}" ref="{{ row.code.codeRef }}"></code-ref>
+            <code-ref isolate="{{ isolate }}" ref="{{ row.code.codeRef }}"></code-ref>
           </td>
           <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
           <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_summary.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
similarity index 68%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_summary.dart
rename to runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
index 81430e2..3085702 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_summary.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
@@ -4,13 +4,10 @@
 
 library isolate_summary_element;
 
+import 'isolate_element.dart';
 import 'package:polymer/polymer.dart';
-import 'package:observatory/observatory.dart';
-import 'observatory_element.dart';
 
 @CustomTag('isolate-summary')
-class IsolateSummaryElement extends ObservatoryElement {
-  @published Isolate isolate;
-
+class IsolateSummaryElement extends IsolateElement {
   IsolateSummaryElement.created() : super.created();
 }
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
similarity index 79%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_summary.html
rename to runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index be9da98..62b6c83 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -3,7 +3,7 @@
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="script_ref.html">
 </head>
-<polymer-element name="isolate-summary" extends="observatory-element">
+<polymer-element name="isolate-summary" extends="isolate-element">
   <template>
     <div class="row">
       <div class="col-md-1">
@@ -17,7 +17,7 @@
 
         <div class="row">
           <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ app.locationManager.relativeLink(isolate.id, isolate.entry['id']) }}">
+            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
               {{ isolate.name }}
             </a>
           </template>
@@ -28,9 +28,9 @@
 
         <div class="row">
           <small>
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, isolate.rootLib) }}">library</a>)
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, 'debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ app.locationManager.relativeLink(isolate.id, 'profile') }}">profile</a>)
+            (<a href="{{ isolate.hashLink(isolate.rootLib) }}">library</a>)
+            (<a href="{{ isolate.hashLink('debug/breakpoints') }}">breakpoints</a>)
+            (<a href="{{ isolate.hashLink('profile') }}">profile</a>)
           </small>
         </div>
       </div>
@@ -63,7 +63,7 @@
         </div>
       </div>
       <div class="col-md-2">
-        <a href="{{ app.locationManager.relativeLink(isolate.id, 'allocationprofile') }}">
+        <a href="{{ isolate.hashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
       </div>
@@ -74,7 +74,7 @@
         <template if="{{ isolate.topFrame != null }}">
           run
         </template>
-        ( <a href="{{ app.locationManager.relativeLink(isolate.id, 'stacktrace') }}">stack trace</a> )
+        ( <a href="{{ isolate.hashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
     <div class="row">
@@ -82,9 +82,9 @@
       </div>
       <div class="col-md-6">
         <template if="{{ isolate.topFrame != null }}">
-          <function-ref app="{{ app }}" isolate="{{ isolate }}"
+          <function-ref isolate="{{ isolate }}"
                         ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref app="{{ app }}" isolate="{{ isolate }}"
+          (<script-ref isolate="{{ isolate }}"
                        ref="{{ isolate.topFrame['script'] }}"
                        line="{{ isolate.topFrame['line'] }}"></script-ref>)
           <br>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/json_view.dart b/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/json_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/json_view.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/json_view.html b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/json_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/json_view.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/library_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/library_ref.dart
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/library_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/library_ref.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/library_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/library_ref.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/library_view.dart b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
similarity index 74%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/library_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/library_view.dart
index 05096de..08e23d3 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -4,19 +4,18 @@
 
 library library_view_element;
 
+import 'isolate_element.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 @CustomTag('library-view')
-class LibraryViewElement extends ObservatoryElement {
+class LibraryViewElement extends IsolateElement {
   @published Map library = toObservable({});
 
   LibraryViewElement.created() : super.created();
 
   void refresh(var done) {
-    var url = app.locationManager.currentIsolateRelativeLink(library['id']);
-    app.requestManager.requestMap(url).then((map) {
+    isolate.getMap(library['id']).then((map) {
         library = map;
     }).catchError((e, trace) {
           Logger.root.severe('Error while refreshing library-view: $e\n$trace');
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
similarity index 67%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/library_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/library_view.html
index 2b8f35c..2a195b0 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -3,18 +3,17 @@
   <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="isolate_element.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="library-view" extends="observatory-element">
+<polymer-element name="library-view" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
-      <library-nav-menu app="{{ app }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <library-nav-menu isolate="{{ isolate }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -26,7 +25,7 @@
           {{ script['kind'] }}
         </td>
         <td>
-          <script-ref app="{{ app }}" ref="{{ script }}"></script-ref>
+          <script-ref isolate="{{ isolate }}" ref="{{ script }}"></script-ref>
         </td>
       </tr>
     </tbody>
@@ -36,7 +35,7 @@
     <tbody>
       <tr template repeat="{{ lib in library['libraries'] }}">
         <td>
-          <library-ref app="{{ app }}" ref="{{ lib }}"></library-ref>
+          <library-ref isolate="{{ isolate }}" ref="{{ lib }}"></library-ref>
         </td>
       </tr>
     </tbody>
@@ -45,8 +44,8 @@
   <table class="table table-hover">
     <tbody>
       <tr template repeat="{{ variable in library['variables'] }}">
-        <td><field-ref app="{{ app }}" ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref app="{{ app }}" ref="{{ variable['value'] }}"></instance-ref></td>
+        <td><field-ref isolate="{{ isolate }}" ref="{{ variable }}"></field-ref></td>
+        <td><instance-ref isolate="{{ isolate }}" ref="{{ variable['value'] }}"></instance-ref></td>
       </tr>
     </tbody>
   </table>
@@ -55,7 +54,7 @@
     <tbody>
       <tr template repeat="{{ func in library['functions'] }}">
         <td>
-          <function-ref app="{{ app }}" ref="{{ func }}"></function-ref>
+          <function-ref isolate="{{ isolate }}" ref="{{ func }}"></function-ref>
         </td>
       </tr>
     </tbody>
@@ -71,10 +70,10 @@
     <tbody>
       <tr template repeat="{{ cls in library['classes'] }}">
         <td>
-          <class-ref app="{{ app }}" ref="{{ cls }}"></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ cls }}"></class-ref>
         </td>
         <td>
-          <class-ref app="{{ app }}" ref="{{ cls }}" internal></class-ref>
+          <class-ref isolate="{{ isolate }}" ref="{{ cls }}" internal></class-ref>
         </td>
       </tr>
     </tbody>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/message_viewer.dart b/runtime/bin/vmservice/client/lib/src/elements/message_viewer.dart
similarity index 76%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/message_viewer.dart
rename to runtime/bin/vmservice/client/lib/src/elements/message_viewer.dart
index 1899e7c..9979d7a 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/message_viewer.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/message_viewer.dart
@@ -5,6 +5,7 @@
 library message_viewer_element;
 
 import 'package:logging/logging.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 import 'observatory_element.dart';
 
@@ -12,12 +13,16 @@
 class MessageViewerElement extends ObservatoryElement {
   Map _message;
   @published Map get message => _message;
+  @published ObservatoryApplication app;
 
   @published set message(Map m) {
+    if (m == null) {
+      Logger.root.info('Viewing null message.');
+      return;
+    }
+    Logger.root.info('Viewing message of type \'${m['type']}\'');
     _message = m;
     notifyPropertyChange(#messageType, "", messageType);
-    notifyPropertyChange(#members, [], members);
-    Logger.root.info('Viewing message of type \'${message['type']}\'');
   }
 
   MessageViewerElement.created() : super.created();
@@ -28,11 +33,4 @@
     }
     return message['type'];
   }
-
-  List<Map> get members {
-    if (message == null || message['members'] == null) {
-      return [];
-    }
-    return message['members'];
-  }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/message_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/message_viewer.html
new file mode 100644
index 0000000..a00b2ff
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/message_viewer.html
@@ -0,0 +1,85 @@
+<head>
+  <link rel="import" href="breakpoint_list.html">
+  <link rel="import" href="class_view.html">
+  <link rel="import" href="code_view.html">
+  <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_profile.html">
+  <link rel="import" href="instance_view.html">
+  <link rel="import" href="isolate_list.html">
+  <link rel="import" href="isolate_profile.html">
+  <link rel="import" href="library_view.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_view.html">
+  <link rel="import" href="stack_trace.html">
+</head>
+<polymer-element name="message-viewer" extends="observatory-element">
+  <!--
+    This is a big switch statement which instantiates the custom element
+    designated to display the message type.
+  -->
+  <template>
+  	<!-- If the message type is an IsolateList -->
+    <template if="{{ messageType == 'IsolateList' }}">
+      <isolate-list vm="{{ app.vm }}"></isolate-list>
+    </template>
+    <!-- If the message type is a StackTrace -->
+    <template if="{{ messageType == 'StackTrace' }}">
+      <stack-trace isolate="{{ app.isolate }}" trace="{{ message }}"></stack-trace>
+    </template>
+    <template if="{{ messageType == 'BreakpointList' }}">
+      <breakpoint-list isolate="{{ app.isolate }}" msg="{{ message }}"></breakpoint-list>
+    </template>
+    <template if="{{ messageType == 'Error' }}">
+      <error-view isolate="{{ app.isolate }}" error="{{ message }}"></error-view>
+    </template>
+    <template if="{{ messageType == 'Library' }}">
+      <library-view isolate="{{ app.isolate }}" library="{{ message }}"></library-view>
+    </template>
+    <template if="{{ messageType == 'Class' }}">
+      <class-view isolate="{{ app.isolate }}" cls="{{ message }}"></class-view>
+    </template>
+    <template if="{{ messageType == 'Field' }}">
+      <field-view isolate="{{ app.isolate }}" field="{{ message }}"></field-view>
+    </template>
+    <template if="{{ messageType == 'Closure' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'Instance' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'Array' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'GrowableObjectArray' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'String' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'Bool' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'Smi' }}">
+      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
+    </template>
+    <template if="{{ messageType == 'Function' }}">
+      <function-view isolate="{{ app.isolate }}" function="{{ message }}"></function-view>
+    </template>
+    <template if="{{ messageType == 'Code' }}">
+      <code-view isolate="{{ app.isolate }}" code="{{ message['code'] }}"></code-view>
+    </template>
+    <template if="{{ messageType == 'Script' }}">
+      <script-view isolate="{{ app.isolate }}" script="{{ message['script'] }}"></script-view>
+    </template>
+    <template if="{{ messageType == 'AllocationProfile' }}">
+      <heap-profile isolate="{{ app.isolate }}" profile="{{ message }}"></heap-profile>
+    </template>
+    <template if="{{ messageType == 'Profile' }}">
+      <isolate-profile isolate="{{ app.isolate }}" profile="{{ message }}"></isolate-profile>
+    </template>
+    <!-- Add new views and message types in the future here. -->
+  </template>
+  <script type="application/dart" src="message_viewer.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
similarity index 88%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/nav_bar.dart
rename to runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index 625adae..96cb731 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -5,8 +5,11 @@
 library nav_bar_element;
 
 import 'dart:html';
-import 'package:polymer/polymer.dart';
+import 'isolate_element.dart';
 import 'observatory_element.dart';
+import 'package:observatory/app.dart';
+import 'package:polymer/polymer.dart';
+
 
 @CustomTag('nav-bar')
 class NavBarElement extends ObservatoryElement {
@@ -34,7 +37,7 @@
 class NavRefreshElement extends ObservatoryElement {
   @published var callback;
   @published bool active = false;
-      
+
   NavRefreshElement.created() : super.created();
 
   void buttonClick(Event e, var detail, Node target) {
@@ -60,15 +63,14 @@
 }
 
 @CustomTag('isolate-nav-menu')
-class IsolateNavMenuElement extends ObservatoryElement {
-  @published Isolate isolate;
+class IsolateNavMenuElement extends IsolateElement {
   @published bool last = false;
 
   IsolateNavMenuElement.created() : super.created();
 }
 
 @CustomTag('library-nav-menu')
-class LibraryNavMenuElement extends ObservatoryElement {
+class LibraryNavMenuElement extends IsolateElement {
   @published Map library;
   @published bool last = false;
 
@@ -76,7 +78,7 @@
 }
 
 @CustomTag('class-nav-menu')
-class ClassNavMenuElement extends ObservatoryElement {
+class ClassNavMenuElement extends IsolateElement {
   @published Map cls;
   @published bool last = false;
 
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
similarity index 84%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/nav_bar.html
rename to runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index 0e7904a..4d8a362 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -1,5 +1,6 @@
 <head>
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="isolate_element.html">
 </head>
 
 <polymer-element name="nav-bar" extends="observatory-element">
@@ -157,34 +158,34 @@
   </template>
 </polymer-element>
 
-<polymer-element name="isolate-nav-menu" extends="observatory-element">
+<polymer-element name="isolate-nav-menu" extends="isolate-element">
   <template>
     <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('stacktrace') }}"
+      <nav-menu-item link="{{ isolate.hashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('profile') }}"
+      <nav-menu-item link="{{ isolate.hashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('allocationprofile') }}"
+      <nav-menu-item link="{{ isolate.hashLink('allocationprofile') }}"
                      anchor="heap profile"></nav-menu-item>
-      <nav-menu-item link="{{ app.locationManager.currentIsolateRelativeLink('debug/breakpoints') }}"
+      <nav-menu-item link="{{ isolate.hashLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="library-nav-menu" extends="observatory-element">
+<polymer-element name="library-nav-menu" extends="isolate-element">
   <template>
-    <nav-menu link="{{ app.locationManager.currentIsolateRelativeLink(library['id']) }}"
+    <nav-menu link="{{ isolate.hashLink(library['id']) }}"
               anchor="{{ library['name'] }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="class-nav-menu" extends="observatory-element">
+<polymer-element name="class-nav-menu" extends="isolate-element">
   <template>
-    <nav-menu link="{{ app.locationManager.currentIsolateRelativeLink(cls['id']) }}"
+    <nav-menu link="{{ isolate.hashLink(cls['id']) }}"
               anchor="{{ cls['user_name'] }}" last="{{ last }}">
       <content></content>
     </nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_application.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
similarity index 90%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_application.dart
rename to runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
index affc779..852cc69 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_application.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
@@ -5,7 +5,7 @@
 library observatory_application_element;
 
 import 'observatory_element.dart';
-import 'package:observatory/observatory.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
 /// Main application tag. Responsible for instantiating an instance of
@@ -14,6 +14,8 @@
 @CustomTag('observatory-application')
 class ObservatoryApplicationElement extends ObservatoryElement {
   @published bool devtools = false;
+  @observable ObservatoryApplication app;
+
   ObservatoryApplicationElement.created() : super.created() {
     if (devtools) {
       app = new ObservatoryApplication.devtools();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
new file mode 100644
index 0000000..58f3d54
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
@@ -0,0 +1,11 @@
+<head>
+  <link rel="import" href="isolate_profile.html">
+  <link rel="import" href="response_viewer.html">
+  <link rel="import" href="observatory_element.html">
+</head>
+<polymer-element name="observatory-application" extends="observatory-element">
+  <template>
+    <response-viewer app="{{ app }}"></response-viewer>
+  </template>
+  <script type="application/dart" src="observatory_application.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
similarity index 88%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_element.dart
rename to runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index 74db7e0..a5537a0 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -6,11 +6,8 @@
 
 import 'dart:math';
 import 'package:polymer/polymer.dart';
-import 'package:observatory/observatory.dart';
-export 'package:observatory/observatory.dart';
 
-/// Base class for all custom elements. Holds an observable
-/// [ObservableApplication] and applies author styles.
+/// Base class for all Observatory custom elements.
 @CustomTag('observatory-element')
 class ObservatoryElement extends PolymerElement {
   ObservatoryElement.created() : super.created();
@@ -23,13 +20,10 @@
     super.leftView();
   }
 
-  void attributeChanged(String name, String oldValue, String newValue) {
+  void attributeChanged(String name, var oldValue, var newValue) {
     super.attributeChanged(name, oldValue, newValue);
   }
 
-  @published ObservatoryApplication app;
-  void appChanged(oldValue) {
-  }
   bool get applyAuthorStyles => true;
 
   static String _zeroPad(int value, int pad) {
@@ -92,7 +86,7 @@
   String fileAndLine(Map frame) {
     var file = frame['script']['user_name'];
     var shortFile = file.substring(file.lastIndexOf('/') + 1);
-    return "${shortFile}:${frame['line']}";    
+    return "${shortFile}:${frame['line']}";
   }
 
   bool isNullRef(String type) {
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_element.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_element.html
rename to runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/response_viewer.dart b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
similarity index 85%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/response_viewer.dart
rename to runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
index d775875..b81272f 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/response_viewer.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
@@ -5,9 +5,11 @@
 library response_viewer_element;
 
 import 'observatory_element.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('response-viewer')
 class ResponseViewerElement extends ObservatoryElement {
+  @published ObservatoryApplication app;
   ResponseViewerElement.created() : super.created();
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
new file mode 100644
index 0000000..18185f1
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
@@ -0,0 +1,10 @@
+<head>
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="message_viewer.html">
+</head>
+<polymer-element name="response-viewer" extends="observatory-element">
+  <template>
+    <message-viewer app="{{ app }}" message="{{ app.response }}"></message-viewer>
+  </template>
+  <script type="application/dart" src="response_viewer.dart"></script>
+</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
similarity index 80%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/script_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
index 05bf87a..4f2794b 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
@@ -11,16 +11,13 @@
 class ScriptRefElement extends ServiceRefElement {
   @published int line = -1;
 
-  String get url {
-    if ((app != null) && (ref != null)) {
-      var baseUrl = relativeLink(ref['id']);
-      if (line < 0) {
-        return baseUrl;
-      } else {
-        return '$baseUrl?line=$line';
-      }
+  String get objectId {
+    if (line < 0) {
+      return super.objectId;
     }
-    return '';
+    // TODO(johnmccutchan): Add a ?line=XX invalidates the idea that this
+    // method returns an objectId.
+    return '${super.objectId}?line=$line';
   }
 
   String get hoverText {
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_ref.html b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
similarity index 100%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/script_ref.html
rename to runtime/bin/vmservice/client/lib/src/elements/script_ref.html
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_view.dart b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
similarity index 68%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/script_view.dart
rename to runtime/bin/vmservice/client/lib/src/elements/script_view.dart
index 9125fc8..7d04c2b 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
@@ -5,15 +5,17 @@
 library script_view_element;
 
 import 'dart:html';
-import 'package:logging/logging.dart';
+import 'isolate_element.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
 
 /// Displays an Error response.
 @CustomTag('script-view')
-class ScriptViewElement extends ObservatoryElement {
+class ScriptViewElement extends IsolateElement {
   @published Script script;
 
+  ScriptViewElement.created() : super.created();
+
   String hitsStyle(ScriptLine line) {
     if (line.hits == -1) {
       return 'min-width:32px;';
@@ -24,14 +26,7 @@
   }
 
   void refreshCoverage(Event e, var detail, Node target) {
-    var isolateId = app.locationManager.currentIsolateId();
-    var isolate = app.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      Logger.root.info('No isolate found.');
-      return;
-    }
-    var request = '/$isolateId/coverage';
-    app.requestManager.requestMap(request).then((Map coverage) {
+    isolate.getMap('coverage').then((Map coverage) {
       assert(coverage['type'] == 'CodeCoverage');
       isolate.updateCoverage(coverage['coverage']);
       notifyPropertyChange(#hitsStyle, "", hitsStyle);
@@ -40,5 +35,5 @@
     });
   }
 
-  ScriptViewElement.created() : super.created();
-}
\ No newline at end of file
+
+}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
similarity index 79%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/script_view.html
rename to runtime/bin/vmservice/client/lib/src/elements/script_view.html
index 05c884d..af8b8f7 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -1,14 +1,14 @@
 <head>
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="isolate_element.html">
 </head>
-<polymer-element name="script-view" extends="observatory-element">
+<polymer-element name="script-view" extends="isolate-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
+    <isolate-nav-menu isolate="{{ isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu app="{{ app }}" library="{{ script.libraryRef }}"></library-nav-menu>
+    <library-nav-menu isolate="{{ isolate }}" library="{{ script.libraryRef }}"></library-nav-menu>
     <nav-menu link="." anchor="{{ script.shortName }}" last="{{ true }}"></nav-menu>
   </nav-bar>
 
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/service_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
similarity index 68%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/service_ref.dart
rename to runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
index 9b3feb2..00c4175 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/service_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
@@ -5,13 +5,12 @@
 library service_ref_element;
 
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
+import 'isolate_element.dart';
 
 @CustomTag('service-ref')
-class ServiceRefElement extends ObservatoryElement {
+class ServiceRefElement extends IsolateElement {
   @published Map ref;
   @published bool internal = false;
-  @published Isolate isolate = null;
   ServiceRefElement.created() : super.created();
 
   void refChanged(oldValue) {
@@ -21,12 +20,14 @@
   }
 
   String get url {
-    if (ref != null) {
-      return relativeLink(ref['id']);
+    if ((isolate == null) || (ref == null)) {
+      return '';
     }
-    return '';
+    return isolate.hashLink(objectId);
   }
 
+  String get objectId => ref == null ? '' : ref['id'];
+
   String get hoverText {
     if (ref == null) {
       return '';
@@ -50,19 +51,4 @@
     }
     return '';
   }
-
-  void isolateChanged(oldValue) {
-    notifyPropertyChange(#relativeLink, 0, 1);
-  }
-
-  @observable
-  String relativeLink(String link) {
-    if (app == null) {
-      return '';
-    } else if (isolate == null) {
-      return app.locationManager.currentIsolateRelativeLink(link);
-    } else {
-      return app.locationManager.relativeLink(isolate.id, link);
-    }
-  }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
new file mode 100644
index 0000000..e7e2779
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
@@ -0,0 +1,6 @@
+<head>
+  <link rel="import" href="isolate_element.html">
+</head>
+<polymer-element name="service-ref" extends="isolate-element">
+  <script type="application/dart" src="service_ref.dart"></script>
+</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_frame.dart b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart
similarity index 82%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/stack_frame.dart
rename to runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart
index 118ddef..021e111 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_frame.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart
@@ -4,11 +4,11 @@
 
 library stack_frame_element;
 
-import 'observatory_element.dart';
+import 'isolate_element.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('stack-frame')
-class StackFrameElement extends ObservatoryElement {
+class StackFrameElement extends IsolateElement {
   @published Map frame = toObservable({});
   StackFrameElement.created() : super.created();
 }
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
similarity index 69%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/stack_frame.html
rename to runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index dbbda32..c453c75 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -2,10 +2,10 @@
   <link rel="import" href="curly_block.html">
   <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="isolate_element.html">
   <link rel="import" href="script_ref.html">
 </head>
-<polymer-element name="stack-frame" extends="observatory-element">
+<polymer-element name="stack-frame" extends="isolate-element">
   <template>
     <style>
       .member {
@@ -19,15 +19,15 @@
         #{{ frame['depth'] }}
       </div>
       <div class="col-md-9">
-        <function-ref app="{{ app }}" ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref app="{{ app }}" ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        <function-ref isolate="{{ isolate }}" ref="{{ frame['function'] }}"></function-ref>
+        ( <script-ref isolate="{{ isolate }}" 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 app="{{ app }}" ref="{{ v['value'] }}"></instance-ref>
+                <instance-ref isolate="{{ isolate }}" ref="{{ v['value'] }}"></instance-ref>
               </td>
             </tr>
           </table>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_trace.dart b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart
similarity index 72%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/stack_trace.dart
rename to runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart
index 8256949..6ccbab2 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_trace.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart
@@ -4,20 +4,18 @@
 
 library stack_trace_element;
 
-import 'dart:html';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
+import 'isolate_element.dart';
 
 @CustomTag('stack-trace')
-class StackTraceElement extends ObservatoryElement {
+class StackTraceElement extends IsolateElement {
   @published Map trace = toObservable({});
 
   StackTraceElement.created() : super.created();
 
   void refresh(var done) {
-    var url = app.locationManager.currentIsolateRelativeLink('stacktrace');
-    app.requestManager.requestMap(url).then((map) {
+    isolate.getMap('stacktrace').then((map) {
         trace = map;
     }).catchError((e, trace) {
         Logger.root.severe('Error while reloading stack trace: $e\n$trace');
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
similarity index 72%
rename from runtime/bin/vmservice/client/lib/src/observatory_elements/stack_trace.html
rename to runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index 2c2ba89..9044754 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -1,14 +1,13 @@
 <head>
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="isolate_element.html">
   <link rel="import" href="stack_frame.html">
 </head>
-<polymer-element name="stack-trace" extends="observatory-element">
+<polymer-element name="stack-trace" extends="isolate-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu app="{{ app }}" isolate="{{ app.locationManager.currentIsolate() }}">
-      </isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -23,7 +22,7 @@
       <ul class="list-group">
         <template repeat="{{ frame in trace['members'] }}">
           <li class="list-group-item">
-            <stack-frame app="{{ app }}" frame="{{ frame }}"></stack-frame>
+            <stack-frame isolate="{{ isolate }}" frame="{{ frame }}"></stack-frame>
           </li>
         </template>
       </ul>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_element.dart b/runtime/bin/vmservice/client/lib/src/elements/vm_element.dart
new file mode 100644
index 0000000..ec63553
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_element.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm_element;
+
+import 'observatory_element.dart';
+import 'package:observatory/app.dart';
+import 'package:polymer/polymer.dart';
+
+/// Base class for all custom elements which reference a VM.
+/// Holds an observable [VM].
+@CustomTag('vm-element')
+class VMElement extends ObservatoryElement {
+  VMElement.created() : super.created();
+  @published VM vm;
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_element.html b/runtime/bin/vmservice/client/lib/src/elements/vm_element.html
new file mode 100644
index 0000000..842ef6f
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_element.html
@@ -0,0 +1,6 @@
+<head>
+  <link rel="import" href="observatory_element.html">
+</head>
+<polymer-element name="vm-element" extends="observatory-element">
+  <script type="application/dart" src="vm_element.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/application.dart b/runtime/bin/vmservice/client/lib/src/observatory/application.dart
deleted file mode 100644
index 1661892..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory/application.dart
+++ /dev/null
@@ -1,68 +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.
-
-part of observatory;
-
-/// The observatory application. Instances of this are created and owned
-/// by the observatory_application custom element.
-class ObservatoryApplication extends Observable {
-  @observable final LocationManager locationManager;
-  @observable final RequestManager requestManager;
-  @observable final IsolateManager isolateManager;
-
-  void _setup() {
-    locationManager._application = this;
-    requestManager._application = this;
-    isolateManager._application = this;
-    Isolate._application = this;
-    requestManager.interceptor = isolateManager._responseInterceptor;
-    locationManager.init();
-  }
-
-  ObservatoryApplication.devtools() :
-      locationManager = new LocationManager(),
-      requestManager = new PostMessageRequestManager(),
-      isolateManager = new IsolateManager() {
-    _setup();
-  }
-
-  ObservatoryApplication() :
-      locationManager = new LocationManager(),
-      requestManager = new HttpRequestManager(),
-      isolateManager = new IsolateManager() {
-    _setup();
-  }
-
-  /// Return the [Isolate] with [id].
-  Isolate getIsolate(int id) {
-    return isolateManager.isolates[id];
-  }
-
-  /// Return the name of the isolate with [id].
-  String getIsolateName(int id) {
-    var isolate = getIsolate(id);
-    if (isolate == null) {
-      return 'Null Isolate';
-    }
-    return isolate.name;
-  }
-
-  static const int KB = 1024;
-  static const int MB = KB * 1024;
-  static String scaledSizeUnits(int x) {
-    if (x > 2 * MB) {
-      var y = x / MB;
-      return '${y.toStringAsFixed(1)} MB';
-    } else if (x > 2 * KB) {
-      var y = x / KB;
-      return '${y.toStringAsFixed(1)} KB';
-    }
-    var y = x.toDouble();
-    return '${y.toStringAsFixed(1)} B';
-  }
-
-  static String timeUnits(double x) {
-    return x.toStringAsFixed(2);
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/isolate.dart b/runtime/bin/vmservice/client/lib/src/observatory/isolate.dart
deleted file mode 100644
index 0135c4b..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory/isolate.dart
+++ /dev/null
@@ -1,125 +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.
-
-part of observatory;
-
-
-/// State for a running isolate.
-class Isolate extends Observable {
-  static ObservatoryApplication _application;
-
-  @observable Profile profile;
-  @observable final Map<String, Script> scripts =
-      toObservable(new Map<String, Script>());
-  @observable final List<Code> codes = new List<Code>();
-  @observable String id;
-  @observable String name;
-  @observable String vmName;
-  @observable Map entry;
-  @observable String rootLib;
-  @observable final Map<String, double> timers =
-      toObservable(new Map<String, double>());
-
-  @observable int newHeapUsed = 0;
-  @observable int oldHeapUsed = 0;
-
-  @observable Map topFrame = null;
-  @observable String fileAndLine = null;
-  
-  Isolate.fromId(this.id) : name = 'isolate' {}
-  
-  Isolate.fromMap(Map map)
-      : id = map['id'], name = map['name'] {
-  }
-
-  Future refresh() {
-     var request = '/$id/';
-     return _application.requestManager.requestMap(request).then((map) {
-         update(map);
-       }).catchError((e, trace) {
-           Logger.root.severe('Error while updating isolate summary: $e\n$trace');
-       });
-  }
-
-  void update(Map map) {
-    if (map['type'] != 'Isolate') {
-      Logger.root.severe('Unexpected message type in Isolate.update: ${map["type"]}');
-      return;
-    }
-    if (map['rootLib'] == null ||
-        map['timers'] == null ||
-        map['heap'] == null) {
-      Logger.root.severe("Malformed 'Isolate' response: $map");
-      return;
-    }
-    rootLib = map['rootLib']['id'];
-    vmName = map['name'];
-    if (map['entry'] != null) {
-      entry = map['entry'];
-      name = entry['name'];
-    } else {
-      // fred
-      name = 'root isolate';
-    }
-    if (map['topFrame'] != null) {
-      topFrame = map['topFrame'];
-    }
-
-    var timerMap = {};
-    map['timers'].forEach((timer) {
-        timerMap[timer['name']] = timer['time'];
-      });
-    timers['total'] = timerMap['time_total_runtime'];
-    timers['compile'] = timerMap['time_compilation'];
-    timers['gc'] = 0.0;  // TODO(turnidge): Export this from VM.
-    timers['init'] = (timerMap['time_script_loading'] +
-                      timerMap['time_creating_snapshot'] +
-                      timerMap['time_isolate_initialization'] +
-                      timerMap['time_bootstrap']);
-    timers['dart'] = timerMap['time_dart_execution'];
-
-    newHeapUsed = map['heap']['usedNew'];
-    oldHeapUsed = map['heap']['usedOld'];
-  }
-
-  String toString() => '$id';
-
-  Code findCodeByAddress(int address) {
-    for (var i = 0; i < codes.length; i++) {
-      if (codes[i].contains(address)) {
-        return codes[i];
-      }
-    }
-    return null;
-  }
-
-  Code findCodeByName(String name) {
-    for (var i = 0; i < codes.length; i++) {
-      if (codes[i].name == name) {
-        return codes[i];
-      }
-    }
-    return null;
-  }
-
-  void resetCodeTicks() {
-    Logger.root.info('Reset all code ticks.');
-    for (var i = 0; i < codes.length; i++) {
-      codes[i].resetTicks();
-    }
-  }
-
-  void updateCoverage(List coverages) {
-    for (var coverage in coverages) {
-      var id = coverage['script']['id'];
-      var script = scripts[id];
-      if (script == null) {
-        script = new Script.fromMap(coverage['script']);
-        scripts[id] = script;
-      }
-      assert(script != null);
-      script._processCoverageHits(coverage['hits']);
-    }
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/isolate_manager.dart b/runtime/bin/vmservice/client/lib/src/observatory/isolate_manager.dart
deleted file mode 100644
index 02202b1..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory/isolate_manager.dart
+++ /dev/null
@@ -1,63 +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.
-
-part of observatory;
-
-/// Collection of isolates which are running in the VM. Updated
-class IsolateManager extends Observable {
-  ObservatoryApplication _application;
-  ObservatoryApplication get application => _application;
-
-  @observable final Map<String, Isolate> isolates =
-      toObservable(new Map<String, Isolate>());
-
-  static bool _foundIsolateInMembers(String id, List<Map> members) {
-    return members.any((E) => E['id'] == id);
-  }
-
-  void _responseInterceptor() {
-    _application.requestManager.responses.forEach((response) {
-      if (response['type'] == 'IsolateList') {
-        _updateIsolates(response['members']);
-      }
-    });
-  }
-
-  Isolate getIsolate(String id) {
-    Isolate isolate = isolates[id];
-    if (isolate == null) {
-      isolate = new Isolate.fromId(id);
-      isolates[id] = isolate;
-    }
-    if (isolate.vmName == null) {
-      // First time we are using this isolate.
-      isolate.refresh();
-    }
-    return isolate;
-  }
-
-  void _updateIsolates(List<Map> members) {
-    // Find dead isolates.
-    var deadIsolates = [];
-    isolates.forEach((k, v) {
-      if (!_foundIsolateInMembers(k, members)) {
-        deadIsolates.add(k);
-      }
-    });
-    // Remove them.
-    deadIsolates.forEach((id) {
-      isolates.remove(id);
-    });
-    // Add new isolates.
-    members.forEach((map) {
-      var id = map['id'];
-      var isolate = isolates[id];
-      if (isolate == null) {
-        isolate = new Isolate.fromMap(map);
-        isolates[id] = isolate;
-      }
-      isolate.refresh();
-    });
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/request_manager.dart b/runtime/bin/vmservice/client/lib/src/observatory/request_manager.dart
deleted file mode 100644
index 6aabbfd..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory/request_manager.dart
+++ /dev/null
@@ -1,295 +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.
-
-part of observatory;
-
-/// A request response interceptor is called for each response.
-typedef void RequestResponseInterceptor();
-
-abstract class RequestManager extends Observable {
-  ObservatoryApplication _application;
-  ObservatoryApplication get application => _application;
-  RequestResponseInterceptor interceptor;
-
-  /// The default request prefix is 127.0.0.1 on port 8181.
-  @observable String prefix = 'http://127.0.0.1:8181';
-  /// List of responses.
-  @observable List<Map> responses = toObservable([]);
-
-  /// Decode [response] into a map.
-  Map decodeResponse(String response) {
-    var m;
-    try {
-      m = JSON.decode(response);
-    } catch (e, st) {
-      setResponseError('$e $st');
-    };
-    return m;
-  }
-
-  /// Parse
-  void parseResponses(String responseString) {
-    var r = decodeResponse(responseString);
-    if (r == null) {
-      return;
-    }
-    if (r is Map) {
-      setResponses([r]);
-    } else {
-      setResponses(r);
-    }
-  }
-
-  void setResponses(List<Map> r) {
-    responses = toObservable(r);
-    if (interceptor != null) {
-      interceptor();
-    }
-  }
-
-  void setResponseRequestError(HttpRequest request) {
-    String error = '${request.status} ${request.statusText}';
-    if (request.status == 0) {
-      error = 'No service found. Did you run with --enable-vm-service ?';
-    }
-    setResponses([{
-      'type': 'Error',
-      'errorType': 'RequestError',
-      'text': error
-    }]);
-  }
-
-  void setResponseError(String message) {
-    setResponses([{
-      'type': 'Error',
-      'errorType': 'ResponseError',
-      'text': message
-    }]);
-    Logger.root.severe(message);
-  }
-
-  static final RegExp _codeMatcher = new RegExp(r'/isolates/\d+/code/');
-  static bool isCodeRequest(url) => _codeMatcher.hasMatch(url);
-  static int codeAddressFromRequest(String url) {
-    Match m = _codeMatcher.matchAsPrefix(url);
-    if (m == null) {
-      return 0;
-    }
-    try {
-      var a = int.parse(m.input.substring(m.end), radix: 16);
-      return a;
-    } catch (e) {
-      return 0;
-    }
-  }
-
-  static final RegExp _isolateMatcher = new RegExp(r"/isolates/\d+");
-  static String isolatePrefixFromRequest(String url) {
-    Match m = _isolateMatcher.matchAsPrefix(url);
-    if (m == null) {
-      return null;
-    }
-    return m.input.substring(m.start, m.end);
-  }
-
-  static String isolateIdFromRequest(String url) {
-    var prefix = isolatePrefixFromRequest(url);
-    if (prefix == null) {
-      return null;
-    }
-    // Chop off the '/'.
-    return prefix.substring(1);
-  }
-
-  static final RegExp _scriptMatcher = new RegExp(r'/isolates/\d+/scripts/.+');
-  static bool isScriptRequest(url) => _scriptMatcher.hasMatch(url);
-  static final RegExp _scriptPrefixMatcher =
-      new RegExp(r'/isolates/\d+/');
-  static String scriptUrlFromRequest(String url) {
-    var m = _scriptPrefixMatcher.matchAsPrefix(url);
-    if (m == null) {
-      return null;
-    }
-    return m.input.substring(m.end);
-  }
-
-  void _setModelResponse(String type, String modelName, dynamic model) {
-    var response = {
-      'type': type,
-      modelName: model
-    };
-    setResponses([response]);
-  }
-
-  /// Handle 'Code' requests
-  void _getCode(String requestString) {
-    var isolateId = isolateIdFromRequest(requestString);
-    if (isolateId == null) {
-      setResponseError('$isolateId is not an isolate id.');
-      return;
-    }
-    var isolate = _application.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      setResponseError('$isolateId could not be found.');
-      return;
-    }
-    var address = codeAddressFromRequest(requestString);
-    if (address == 0) {
-      setResponseError('$requestString is not a valid code request.');
-      return;
-    }
-    var code = isolate.findCodeByAddress(address);
-    if (code != null) {
-      Logger.root.info(
-          'Found code with 0x${address.toRadixString(16)} in isolate.');
-      _setModelResponse('Code', 'code', code);
-      return;
-    }
-    request(requestString).then((responseString) {
-      var map = decodeResponse(responseString);
-      if (map == null) {
-        return;
-      }
-      assert(map['type'] == 'Code');
-      var code = new Code.fromMap(map);
-      Logger.root.info(
-          'Added code with 0x${address.toRadixString(16)} to isolate.');
-      isolate.codes.add(code);
-      _setModelResponse('Code', 'code', code);
-    }).catchError(_requestCatchError);
-  }
-
-  void _getScript(String requestString) {
-    var isolateId = isolateIdFromRequest(requestString);
-    if (isolateId == null) {
-      setResponseError('$isolateId is not an isolate id.');
-      return;
-    }
-    var isolate = _application.isolateManager.getIsolate(isolateId);
-    if (isolate == null) {
-      setResponseError('$isolateId could not be found.');
-      return;
-    }
-    var url = scriptUrlFromRequest(requestString);
-    if (url == null) {
-      setResponseError('$requestString is not a valid script request.');
-      return;
-    }
-    var script = isolate.scripts[url];
-    if ((script != null) && !script.needsSource) {
-      Logger.root.info('Found script ${script.scriptRef['name']} in isolate');
-      _setModelResponse('Script', 'script', script);
-      return;
-    }
-    if (script != null) {
-      // The isolate has the script but no script source code.
-      requestMap(requestString).then((response) {
-        assert(response['type'] == 'Script');
-        script._processSource(response['source']);
-        Logger.root.info(
-            'Grabbed script ${script.scriptRef['name']} source.');
-        _setModelResponse('Script', 'script', script);
-      });
-      return;
-    }
-    // New script.
-    requestMap(requestString).then((response) {
-      assert(response['type'] == 'Script');
-      var script = new Script.fromMap(response);
-      Logger.root.info(
-          'Added script ${script.scriptRef['name']} to isolate.');
-      _setModelResponse('Script', 'script', script);
-      isolate.scripts[url] = script;
-    });
-  }
-
-  void _requestCatchError(e, st) {
-    if (e is ProgressEvent) {
-      setResponseRequestError(e.target);
-    } else {
-      setResponseError('$e $st');
-    }
-  }
-
-  /// Request [request] from the VM service. Updates [responses].
-  /// Will trigger [interceptor] if one is set.
-  void get(String requestString) {
-    if (isCodeRequest(requestString)) {
-      _getCode(requestString);
-      return;
-    }
-    if (isScriptRequest(requestString)) {
-      _getScript(requestString);
-      return;
-    }
-    request(requestString).then((responseString) {
-      parseResponses(responseString);
-    }).catchError(_requestCatchError);
-  }
-
-  /// Abstract method. Given the [requestString], return a String in the
-  /// future which contains the reply from the VM service.
-  Future<String> request(String requestString);
-
-  Future<ObservableMap> requestMap(String requestString) {
-    if (requestString.startsWith('#')) {
-      requestString = requestString.substring(1);
-    }
-    return request(requestString).then((response) {
-      try {
-        var m = JSON.decode(response);
-        return toObservable(m);
-      } catch (e) { }
-      return null;
-    });
-  }
-}
-
-
-class HttpRequestManager extends RequestManager {
-  Future<String> request(String requestString) {
-    Logger.root.info('Requesting $requestString');
-    return HttpRequest.getString(prefix + requestString);
-  }
-}
-
-class PostMessageRequestManager extends RequestManager {
-  final Map _outstandingRequests = new Map();
-  int _requestSerial = 0;
-  PostMessageRequestManager() {
-    window.onMessage.listen(_messageHandler);
-  }
-
-  void _messageHandler(msg) {
-    var id = msg.data['id'];
-    var name = msg.data['name'];
-    var data = msg.data['data'];
-    if (name != 'observatoryData') {
-      return;
-    }
-    var completer = _outstandingRequests[id];
-    if (completer != null) {
-      _outstandingRequests.remove(id);
-      print('Completing $id');
-      completer.complete(data);
-    } else {
-      print('Could not find completer for $id');
-    }
-  }
-
-  Future<String> request(String requestString) {
-    var idString = '$_requestSerial';
-    Map message = {};
-    message['id'] = idString;
-    message['method'] = 'observatoryQuery';
-    message['query'] = requestString;
-    _requestSerial++;
-
-    var completer = new Completer();
-    _outstandingRequests[idString] = completer;
-
-    window.parent.postMessage(JSON.encode(message), '*');
-    return completer.future;
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_ref.dart b/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_ref.dart
deleted file mode 100644
index e305c18..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/instance_ref.dart
+++ /dev/null
@@ -1,45 +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.
-
-library instance_ref_element;
-
-import 'package:logging/logging.dart';
-import 'package:polymer/polymer.dart';
-import 'service_ref.dart';
-
-@CustomTag('instance-ref')
-class InstanceRefElement extends ServiceRefElement {
-  InstanceRefElement.created() : super.created();
-
-  String get name {
-    if (ref == null) {
-      return super.name;
-    }
-    return ref['preview'];
-  }
-
-  // TODO(turnidge): This is here to workaround vm/dart2js differences.
-  dynamic expander() {
-    return expandEvent;
-  }
-
-  void expandEvent(bool expand, var done) {
-    print("Calling expandEvent");
-    if (expand) {
-      app.requestManager.requestMap(url).then((map) {
-          print("Result is : $map");
-          ref['fields'] = map['fields'];
-          ref['elements'] = map['elements'];
-          ref['length'] = map['length'];
-          print("ref is $ref");
-      }).catchError((e, trace) {
-          Logger.root.severe('Error while expanding instance-ref: $e\n$trace');
-      }).whenComplete(done);
-    } else {
-      ref['fields'] = null;
-      ref['elements'] = null;
-      done();
-    }
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/message_viewer.html b/runtime/bin/vmservice/client/lib/src/observatory_elements/message_viewer.html
deleted file mode 100644
index 581abf8c..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/message_viewer.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<head>
-  <link rel="import" href="breakpoint_list.html">
-  <link rel="import" href="class_view.html">
-  <link rel="import" href="code_view.html">
-  <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_profile.html">
-  <link rel="import" href="instance_view.html">
-  <link rel="import" href="isolate_list.html">
-  <link rel="import" href="json_view.html">
-  <link rel="import" href="library_view.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_view.html">
-  <link rel="import" href="stack_trace.html">
-</head>
-<polymer-element name="message-viewer" extends="observatory-element">
-  <!--
-    This is a big switch statement which instantiates the custom element
-    designated to display the message type.
-  -->
-  <template>
-  	<!-- If the message type is an IsolateList -->
-    <template if="{{ messageType == 'IsolateList' }}">
-      <isolate-list app="{{ app }}"></isolate-list>
-    </template>
-    <!-- If the message type is a StackTrace -->
-    <template if="{{ messageType == 'StackTrace' }}">
-      <stack-trace app="{{ app }}" trace="{{ message }}"></stack-trace>
-    </template>
-    <template if="{{ messageType == 'BreakpointList' }}">
-      <breakpoint-list app="{{ app }}" msg="{{ message }}"></breakpoint-list>
-    </template>
-    <template if="{{ messageType == 'Error' }}">
-      <error-view app="{{ app }}" error="{{ message }}"></error-view>
-    </template>
-    <template if="{{ messageType == 'Library' }}">
-      <library-view app="{{ app }}" library="{{ message }}"></library-view>
-    </template>
-    <template if="{{ messageType == 'Class' }}">
-      <class-view app="{{ app }}" cls="{{ message }}"></class-view>
-    </template>
-    <template if="{{ messageType == 'Field' }}">
-      <field-view app="{{ app }}" field="{{ message }}"></field-view>
-    </template>
-    <template if="{{ messageType == 'Closure' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Instance' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Array' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'GrowableObjectArray' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'String' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Bool' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Smi' }}">
-      <instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Function' }}">
-      <function-view app="{{ app }}" function="{{ message }}"></function-view>
-    </template>
-    <template if="{{ messageType == 'Code' }}">
-      <code-view app="{{ app }}" code="{{ message['code'] }}"></code-view>
-    </template>
-    <template if="{{ messageType == 'Script' }}">
-      <script-view app="{{ app }}" script="{{ message['script'] }}"></script-view>
-    </template>
-    <template if="{{ messageType == 'AllocationProfile' }}">
-      <heap-profile app="{{ app }}" profile="{{ message }}"></heap-profile>
-    </template>
-    <template if="{{ messageType == 'CPU' }}">
-      <json-view json="{{ message }}"></json-view>
-    </template>
-    <!-- Add new views and message types in the future here. -->
-  </template>
-  <script type="application/dart" src="message_viewer.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_application.html b/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_application.html
deleted file mode 100644
index effd98a..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/observatory_application.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<head>
-  <link rel="import" href="isolate_profile.html">
-  <link rel="import" href="response_viewer.html">
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="observatory-application" extends="observatory-element">
-  <template>
-    <template if="{{ app.locationManager.profile }}">
-      <isolate-profile app="{{ app }}"></isolate-profile>
-    </template>
-    <template if="{{ app.locationManager.profile == false }}">
-      <response-viewer app="{{ app }}"></response-viewer>
-    </template>
-  </template>
-  <script type="application/dart" src="observatory_application.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/response_viewer.html b/runtime/bin/vmservice/client/lib/src/observatory_elements/response_viewer.html
deleted file mode 100644
index 0e9c32a..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/response_viewer.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="collapsible_content.html">
-  <link rel="import" href="message_viewer.html">
-  <link rel="import" href="json_view.html">
-</head>
-<polymer-element name="response-viewer" extends="observatory-element">
-  <template>
-    <template repeat="{{ message in app.requestManager.responses }}">
-      <message-viewer app="{{ app }}" message="{{ message }}"></message-viewer>
-    </template>
-  </template>
-  <script type="application/dart" src="response_viewer.dart"></script>
-</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/service_ref.html b/runtime/bin/vmservice/client/lib/src/observatory_elements/service_ref.html
deleted file mode 100644
index 1818675..0000000
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/service_ref.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart" src="service_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/precommit.sh b/runtime/bin/vmservice/client/precommit.sh
index 13325b2..1957b7f 100755
--- a/runtime/bin/vmservice/client/precommit.sh
+++ b/runtime/bin/vmservice/client/precommit.sh
@@ -48,7 +48,7 @@
 # The polymer compilation step munges <img> src urls and adds a packages/
 # prefix to the url. Because of how we deploy we must undo this and remove
 # the prefix. Without this, images will show up as broken links.
-perl -pi -e 's/packages\/observatory\/src\/observatory_elements\///g' \
+perl -pi -e 's/packages\/observatory\/src\/elements\///g' \
     $DEPLOYED/index.html
-perl -pi -e 's/packages\/observatory\/src\/observatory_elements\///g' \
-    $DEPLOYED/index_devtools.html
\ No newline at end of file
+perl -pi -e 's/packages\/observatory\/src\/elements\///g' \
+    $DEPLOYED/index_devtools.html
diff --git a/runtime/bin/vmservice/client/web/index.html b/runtime/bin/vmservice/client/web/index.html
index b70eb7f..3fa51d0 100644
--- a/runtime/bin/vmservice/client/web/index.html
+++ b/runtime/bin/vmservice/client/web/index.html
@@ -7,7 +7,7 @@
   <title>Dart VM Observatory</title>
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
   <script src="packages/browser/interop.js"></script>
-  <link rel="import" href="packages/observatory/observatory_elements.html">
+  <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
 </head>
diff --git a/runtime/bin/vmservice/client/web/index_devtools.html b/runtime/bin/vmservice/client/web/index_devtools.html
index b38a2b2..f52491b 100644
--- a/runtime/bin/vmservice/client/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/web/index_devtools.html
@@ -6,7 +6,7 @@
                         href="bootstrap_css/css/bootstrap.min.css" />
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
   <script src="packages/browser/interop.js"></script>
-  <link rel="import" href="packages/observatory/observatory_elements.html">
+  <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
 </head>
diff --git a/runtime/bin/vmservice/client/web/main.dart b/runtime/bin/vmservice/client/web/main.dart
index 1ec964b..f386529 100644
--- a/runtime/bin/vmservice/client/web/main.dart
+++ b/runtime/bin/vmservice/client/web/main.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:logging/logging.dart';
-import 'package:observatory/observatory.dart';
+import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
 main() {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 95a38f94..28d87f0 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1790,9 +1790,7 @@
  * \param peer An external pointer to associate with this array.
  *
  * \return The TypedData object if no error occurs. Otherwise returns
- *   an error handle. The TypedData object is returned in a
- *   WeakPersistentHandle which needs to be deleted in the specified callback
- *   using Dart_DeletePersistentHandle.
+ *   an error handle.
  */
 DART_EXPORT Dart_Handle Dart_NewExternalTypedData(Dart_TypedData_Type type,
                                                   void* data,
diff --git a/runtime/lib/bool.cc b/runtime/lib/bool.cc
index d575745..c78ea89 100644
--- a/runtime/lib/bool.cc
+++ b/runtime/lib/bool.cc
@@ -21,6 +21,7 @@
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Bool, default_value, arguments->NativeArgAt(2));
   // Call the embedder to supply us with the environment.
+  Api::Scope api_scope(isolate);
   Dart_EnvironmentCallback callback = isolate->environment_callback();
   if (callback != NULL) {
     Dart_Handle result = callback(Api::NewHandle(isolate, name.raw()));
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 4e64ea5..a0397d5 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -239,6 +239,7 @@
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Integer, default_value, arguments->NativeArgAt(2));
   // Call the embedder to supply us with the environment.
+  Api::Scope api_scope(isolate);
   Dart_EnvironmentCallback callback = isolate->environment_callback();
   if (callback != NULL) {
     Dart_Handle response = callback(Api::NewHandle(isolate, name.raw()));
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 87a8024..0b846e1 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -238,7 +238,7 @@
       readyPort.handler = (readyMessage) {
         assert(readyMessage == 'started');
         readyPort.close();
-        completer.complete(new Isolate._fromControlPort(controlPort));
+        completer.complete(new Isolate(controlPort));
       };
       return completer.future;
     } catch (e, st) {
@@ -258,7 +258,7 @@
       readyPort.handler = (readyMessage) {
         assert(readyMessage == 'started');
         readyPort.close();
-        completer.complete(new Isolate._fromControlPort(controlPort));
+        completer.complete(new Isolate(controlPort));
       };
       return completer.future;
     } catch (e, st) {
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 47a82ed..111b70c 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -19,6 +19,7 @@
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(String, default_value, arguments->NativeArgAt(2));
   // Call the embedder to supply us with the environment.
+  Api::Scope api_scope(isolate);
   Dart_EnvironmentCallback callback = isolate->environment_callback();
   if (callback != NULL) {
     Dart_Handle result = callback(Api::NewHandle(isolate, name.raw()));
diff --git a/runtime/vm/assembler.cc b/runtime/vm/assembler.cc
index ff08c9a..8c0516e 100644
--- a/runtime/vm/assembler.cc
+++ b/runtime/vm/assembler.cc
@@ -13,13 +13,16 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, code_comments, false,
+DEFINE_FLAG(bool, code_comments, true,
             "Include comments into code and disassembly");
 #if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
 DEFINE_FLAG(bool, use_far_branches, false,
             "Enable far branches for ARM and MIPS");
 #endif
 
+DECLARE_FLAG(bool, disassemble);
+DECLARE_FLAG(bool, disassemble_optimized);
+
 static uword NewContents(intptr_t capacity) {
   Zone* zone = Isolate::Current()->current_zone();
   uword result = zone->AllocUnsafe(capacity);
@@ -207,7 +210,7 @@
 
 
 void Assembler::Comment(const char* format, ...) {
-  if (FLAG_code_comments) {
+  if (FLAG_code_comments && (FLAG_disassemble || FLAG_disassemble_optimized)) {
     char buffer[1024];
 
     va_list args;
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index de90c6d..ded1104 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -813,10 +813,11 @@
   // At this point, we can only have a parameterized_type.
   const Type& parameterized_type = Type::Cast(type);
 
+  Isolate* isolate = Isolate::Current();
   // This type is the root type of the type graph if no pending types queue is
   // allocated yet.
   const bool is_root_type = (pending_types == NULL);
-  GrowableObjectArray& types = GrowableObjectArray::Handle();
+  GrowableObjectArray& types = GrowableObjectArray::Handle(isolate);
   if (is_root_type) {
     types = GrowableObjectArray::New();
     pending_types = &types;
@@ -827,7 +828,7 @@
   // the type itself, a precondition to calling FinalizeType).
   // Also, the interfaces of the type class must be resolved and the type
   // parameters of the type class must be finalized.
-  Class& type_class = Class::Handle(parameterized_type.type_class());
+  Class& type_class = Class::Handle(isolate, parameterized_type.type_class());
   if (!type_class.is_type_finalized()) {
     FinalizeTypeParameters(type_class, pending_types);
     ResolveUpperBounds(type_class);
@@ -843,13 +844,14 @@
   // Specifying no type arguments indicates a raw type, which is not an error.
   // However, type parameter bounds are checked below, even for a raw type.
   TypeArguments& arguments =
-      TypeArguments::Handle(parameterized_type.arguments());
+      TypeArguments::Handle(isolate, parameterized_type.arguments());
   if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
     // Wrong number of type arguments. The type is mapped to the raw type.
     if (FLAG_error_on_bad_type) {
-      const Script& script = Script::Handle(cls.script());
-      const String& type_class_name = String::Handle(type_class.Name());
-      ReportError(Error::Handle(),  // No previous error.
+      const Script& script = Script::Handle(isolate, cls.script());
+      const String& type_class_name =
+          String::Handle(isolate, type_class.Name());
+      ReportError(Error::Handle(isolate),  // No previous error.
                   script, parameterized_type.token_pos(),
                   "wrong number of type arguments for class '%s'",
                   type_class_name.ToCString());
@@ -863,8 +865,8 @@
   // The full type argument vector consists of the type arguments of the
   // super types of type_class, which are initialized from the parsed
   // type arguments, followed by the parsed type arguments.
-  TypeArguments& full_arguments = TypeArguments::Handle();
-  Error& bound_error = Error::Handle();
+  TypeArguments& full_arguments = TypeArguments::Handle(isolate);
+  Error& bound_error = Error::Handle(isolate);
   if (num_type_arguments > 0) {
     // If no type arguments were parsed and if the super types do not prepend
     // type arguments to the vector, we can leave the vector as null.
@@ -873,7 +875,8 @@
       // Copy the parsed type arguments at the correct offset in the full type
       // argument vector.
       const intptr_t offset = num_type_arguments - num_type_parameters;
-      AbstractType& type_arg = AbstractType::Handle(Type::DynamicType());
+      AbstractType& type_arg =
+          AbstractType::Handle(isolate, Type::DynamicType());
       // Leave the temporary type arguments at indices [0..offset[ as null.
       for (intptr_t i = 0; i < num_type_parameters; i++) {
         // If no type parameters were provided, a raw type is desired, so we
@@ -915,10 +918,10 @@
       // signature function may either be an alias or the enclosing class of a
       // local function, in which case the super type of the enclosing class is
       // also considered when filling up the argument vector.
-      Class& owner_class = Class::Handle();
+      Class& owner_class = Class::Handle(isolate);
       if (type_class.IsSignatureClass()) {
         const Function& signature_fun =
-            Function::Handle(type_class.signature_function());
+            Function::Handle(isolate, type_class.signature_function());
         ASSERT(!signature_fun.is_static());
         owner_class = signature_fun.Owner();
       } else {
@@ -954,7 +957,7 @@
   // If we are done finalizing a graph of mutually recursive types, check their
   // bounds.
   if (is_root_type) {
-    Type& type = Type::Handle();
+    Type& type = Type::Handle(isolate);
     for (intptr_t i = 0; i < types.Length(); i++) {
       type ^= types.At(i);
       CheckTypeBounds(cls, type);
@@ -974,7 +977,7 @@
 
   if (FLAG_trace_type_finalization) {
     OS::Print("Done finalizing type '%s' with %" Pd " type args: %s\n",
-              String::Handle(parameterized_type.Name()).ToCString(),
+              String::Handle(isolate, parameterized_type.Name()).ToCString(),
               parameterized_type.arguments() == TypeArguments::null() ?
                   0 : num_type_arguments,
               parameterized_type.ToCString());
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 2f2c0ab..8c05780 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -96,12 +96,63 @@
 }
 
 
+void ClassTable::RegisterAt(intptr_t index, const Class& cls) {
+  ASSERT(index != kIllegalCid);
+  ASSERT(index >= kNumPredefinedCids);
+  if (index >= capacity_) {
+    // Grow the capacity of the class table.
+    intptr_t new_capacity = index + capacity_increment_;
+    if (new_capacity < capacity_) {
+      FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n",
+             index);
+    }
+    RawClass** new_table = reinterpret_cast<RawClass**>(
+        realloc(table_, new_capacity * sizeof(RawClass*)));  // NOLINT
+    ClassHeapStats* new_stats_table = reinterpret_cast<ClassHeapStats*>(
+        realloc(class_heap_stats_table_,
+                new_capacity * sizeof(ClassHeapStats)));  // NOLINT
+    for (intptr_t i = capacity_; i < new_capacity; i++) {
+      new_table[i] = NULL;
+      new_stats_table[i].Initialize();
+    }
+    capacity_ = new_capacity;
+    table_ = new_table;
+    class_heap_stats_table_ = new_stats_table;
+    ASSERT(capacity_increment_ >= 1);
+  }
+  ASSERT(table_[index] == 0);
+  cls.set_id(index);
+  table_[index] = cls.raw();
+  if (index >= top_) {
+    top_ = index + 1;
+  }
+}
+
+
 void ClassTable::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
   visitor->VisitPointers(reinterpret_cast<RawObject**>(&table_[0]), top_);
 }
 
 
+void ClassTable::Validate() {
+  Class& cls = Class::Handle();
+  for (intptr_t i = kNumPredefinedCids; i < top_; i++) {
+    // Some of the class table entries maybe NULL as we create some
+    // top level classes but do not add them to the list of anonymous
+    // classes in a library if there are no top level fields or functions.
+    // Since there are no references to these top level classes they are
+    // not written into a full snapshot and will not be recreated when
+    // we read back the full snapshot. These class slots end up with NULL
+    // entries.
+    if (HasValidClassAt(i)) {
+      cls = At(i);
+      ASSERT(cls.IsClass());
+    }
+  }
+}
+
+
 void ClassTable::Print() {
   Class& cls = Class::Handle();
   String& name = String::Handle();
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index dccc8f7..841fb0b 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -115,8 +115,12 @@
 
   void Register(const Class& cls);
 
+  void RegisterAt(intptr_t index, const Class& cls);
+
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
+  void Validate();
+
   void Print();
 
   void PrintToJSONStream(JSONStream* stream);
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 87b4dd0..656481a 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -34,28 +34,29 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, disassemble, false, "Disassemble dart code.");
-DEFINE_FLAG(bool, disassemble_optimized, false, "Disassemble optimized code.");
-DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler.");
-DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations.");
-DEFINE_FLAG(bool, constant_propagation, true,
-    "Do conditional constant propagation/unreachable code elimination.");
-DEFINE_FLAG(bool, common_subexpression_elimination, true,
-    "Do common subexpression elimination.");
-DEFINE_FLAG(bool, loop_invariant_code_motion, true,
-    "Do loop invariant code motion.");
 DEFINE_FLAG(bool, allocation_sinking, true,
     "Attempt to sink temporary allocations to side exits");
+DEFINE_FLAG(bool, common_subexpression_elimination, true,
+    "Do common subexpression elimination.");
+DEFINE_FLAG(bool, constant_propagation, true,
+    "Do conditional constant propagation/unreachable code elimination.");
 DEFINE_FLAG(int, deoptimization_counter_threshold, 16,
     "How many times we allow deoptimization before we disallow optimization.");
+DEFINE_FLAG(bool, disassemble, false, "Disassemble dart code.");
+DEFINE_FLAG(bool, disassemble_optimized, false, "Disassemble optimized code.");
+DEFINE_FLAG(bool, loop_invariant_code_motion, true,
+    "Do loop invariant code motion.");
 DEFINE_FLAG(bool, print_flow_graph, false, "Print the IR flow graph.");
 DEFINE_FLAG(bool, print_flow_graph_optimized, false,
-            "Print the IR flow graph when optimizing.");
+    "Print the IR flow graph when optimizing.");
 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis");
 DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering.");
+DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations.");
+DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler.");
 DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining");
 DEFINE_FLAG(bool, verify_compiler, false,
     "Enable compiler verification assertions");
+
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
 
 // Compile a function. Should call only if the function has not been compiled.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index ca6d91b..1ab063e 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -80,6 +80,18 @@
 }
 
 
+Heap::Space SpaceForExternal(Isolate* isolate, intptr_t size) {
+  Heap* heap = isolate->heap();
+  // If 'size' would be a significant fraction of new space, then use old.
+  static const int kExtNewRatio = 16;
+  if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) {
+    return Heap::kOld;
+  } else {
+    return Heap::kNew;
+  }
+}
+
+
 Dart_Handle Api::InitNewHandle(Isolate* isolate, RawObject* raw) {
   LocalHandles* local_handles = Api::TopScope(isolate)->local_handles();
   ASSERT(local_handles != NULL);
@@ -1799,7 +1811,11 @@
   CHECK_LENGTH(length, String::kMaxElements);
   CHECK_CALLBACK_STATE(isolate);
   return Api::NewHandle(isolate,
-                        String::NewExternal(latin1_array, length, peer, cback));
+                        String::NewExternal(latin1_array,
+                                            length,
+                                            peer,
+                                            cback,
+                                            SpaceForExternal(isolate, length)));
 }
 
 
@@ -1814,8 +1830,13 @@
   }
   CHECK_LENGTH(length, String::kMaxElements);
   CHECK_CALLBACK_STATE(isolate);
+  intptr_t bytes = length * sizeof(*utf16_array);
   return Api::NewHandle(isolate,
-                        String::NewExternal(utf16_array, length, peer, cback));
+                        String::NewExternal(utf16_array,
+                                            length,
+                                            peer,
+                                            cback,
+                                            SpaceForExternal(isolate, bytes)));
 }
 
 
@@ -2661,9 +2682,13 @@
 static Dart_Handle NewExternalTypedData(
     Isolate* isolate, intptr_t cid, void* data, intptr_t length) {
   CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid));
+  intptr_t bytes = length * ExternalTypedData::ElementSizeInBytes(cid);
   const ExternalTypedData& result = ExternalTypedData::Handle(
       isolate,
-      ExternalTypedData::New(cid, reinterpret_cast<uint8_t*>(data), length));
+      ExternalTypedData::New(cid,
+                             reinterpret_cast<uint8_t*>(data),
+                             length,
+                             SpaceForExternal(isolate, bytes)));
   return Api::NewHandle(isolate, result.raw());
 }
 
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 2f10f43..3a5cf64 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -109,6 +109,20 @@
 
 class Api : AllStatic {
  public:
+  // Create on the stack to provide a new throw-safe api scope.
+  class Scope : public StackResource {
+   public:
+    explicit Scope(Isolate* isolate) : StackResource(isolate) {
+      Dart_EnterScope();
+    }
+    ~Scope() {
+      Dart_ExitScope();
+    }
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(Scope);
+  };
+
   // Creates a new local handle.
   static Dart_Handle NewHandle(Isolate* isolate, RawObject* raw);
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 5c32bc9..4cd09d8 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1022,6 +1022,87 @@
 }
 
 
+TEST_CASE(ExternalStringPretenure) {
+  Isolate* isolate = Isolate::Current();
+  {
+    Dart_EnterScope();
+    static const uint8_t big_data8[16*MB] = {0, };
+    Dart_Handle big8 = Dart_NewExternalLatin1String(
+        big_data8,
+        ARRAY_SIZE(big_data8),
+        NULL,
+        NULL);
+    EXPECT_VALID(big8);
+    static const uint16_t big_data16[16*MB/2] = {0, };
+    Dart_Handle big16 = Dart_NewExternalUTF16String(
+        big_data16,
+        ARRAY_SIZE(big_data16),
+        NULL,
+        NULL);
+    static const uint8_t small_data8[] = {'f', 'o', 'o'};
+    Dart_Handle small8 = Dart_NewExternalLatin1String(
+        small_data8,
+        ARRAY_SIZE(small_data8),
+        NULL,
+        NULL);
+    EXPECT_VALID(small8);
+    static const uint16_t small_data16[] = {'b', 'a', 'r'};
+    Dart_Handle small16 = Dart_NewExternalUTF16String(
+        small_data16,
+        ARRAY_SIZE(small_data16),
+        NULL,
+        NULL);
+    EXPECT_VALID(small16);
+    {
+      DARTSCOPE(isolate);
+      String& handle = String::Handle();
+      handle ^= Api::UnwrapHandle(big8);
+      EXPECT(handle.IsOld());
+      handle ^= Api::UnwrapHandle(big16);
+      EXPECT(handle.IsOld());
+      handle ^= Api::UnwrapHandle(small8);
+      EXPECT(handle.IsNew());
+      handle ^= Api::UnwrapHandle(small16);
+      EXPECT(handle.IsNew());
+    }
+    Dart_ExitScope();
+  }
+}
+
+
+TEST_CASE(ExternalTypedDataPretenure) {
+  Isolate* isolate = Isolate::Current();
+  {
+    Dart_EnterScope();
+    static const int kBigLength = 16*MB/8;
+    int64_t* big_data = new int64_t[kBigLength]();
+    Dart_Handle big = Dart_NewExternalTypedData(
+        Dart_TypedData_kInt64,
+        big_data,
+        kBigLength);
+    EXPECT_VALID(big);
+    static const int kSmallLength = 16*KB/8;
+    int64_t* small_data = new int64_t[kSmallLength]();
+    Dart_Handle small = Dart_NewExternalTypedData(
+        Dart_TypedData_kInt64,
+        small_data,
+        kSmallLength);
+    EXPECT_VALID(small);
+    {
+      DARTSCOPE(isolate);
+      ExternalTypedData& handle = ExternalTypedData::Handle();
+      handle ^= Api::UnwrapHandle(big);
+      EXPECT(handle.IsOld());
+      handle ^= Api::UnwrapHandle(small);
+      EXPECT(handle.IsNew());
+    }
+    Dart_ExitScope();
+    delete[] big_data;
+    delete[] small_data;
+  }
+}
+
+
 TEST_CASE(ListAccess) {
   const char* kScriptChars =
       "List testMain() {"
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 9188027..853034e 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -2283,7 +2283,7 @@
       Field::ZoneHandle(
           Field::New(Symbols::ClosureFunctionField(),
           false,  // !static
-          false,  // !final
+          true,  // final
           false,  // !const
           alloc->cls(),
           0));  // No token position.
@@ -2292,7 +2292,7 @@
       Field::ZoneHandle(Field::New(
           Symbols::ClosureContextField(),
           false,  // !static
-          false,  // !final
+          true,  // final
           false,  // !const
           alloc->cls(),
           0));  // No token position.
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 347a743..0940572 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -24,6 +24,8 @@
 namespace dart {
 
 DECLARE_FLAG(bool, code_comments);
+DECLARE_FLAG(bool, disassemble);
+DECLARE_FLAG(bool, disassemble_optimized);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, intrinsify);
 DECLARE_FLAG(bool, propagate_ic_data);
@@ -264,7 +266,10 @@
     // Compile all successors until an exit, branch, or a block entry.
     for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
       Instruction* instr = it.Current();
-      if (FLAG_code_comments) EmitComment(instr);
+      if (FLAG_code_comments &&
+          (FLAG_disassemble || FLAG_disassemble_optimized)) {
+        EmitComment(instr);
+      }
       if (instr->IsParallelMove()) {
         parallel_move_resolver_.EmitNativeCode(instr->AsParallelMove());
       } else {
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 4a0e35e..afa0bb9 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -5418,6 +5418,8 @@
         if (instr->IsPushArgument() ||
             (instr->IsStoreInstanceField()
              && (use->use_index() != StoreInstanceFieldInstr::kInstancePos)) ||
+            (instr->IsStoreIndexed()
+             && (use->use_index() == StoreIndexedInstr::kValuePos)) ||
             instr->IsStoreStaticField() ||
             instr->IsPhi() ||
             instr->IsAssertAssignable() ||
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 2be58b8..e2e97c2 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -7,7 +7,6 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/flags.h"
-#include "vm/heap_histogram.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_set.h"
@@ -182,7 +181,6 @@
       old_space_->MarkSweep(invoke_api_callbacks);
       RecordAfterGC();
       PrintStats();
-      UpdateObjectHistogram();
       break;
     }
     default:
@@ -191,13 +189,6 @@
 }
 
 
-void Heap::UpdateObjectHistogram() {
-  Isolate* isolate = Isolate::Current();
-  if (isolate->object_histogram() == NULL) return;
-  isolate->object_histogram()->Collect();
-}
-
-
 void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) {
   Isolate* isolate = Isolate::Current();
   ClassTable* class_table = isolate->class_table();
@@ -231,7 +222,6 @@
   old_space_->MarkSweep(kInvokeApiCallbacks);
   RecordAfterGC();
   PrintStats();
-  UpdateObjectHistogram();
 }
 
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 545def1..45d6963 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -278,7 +278,6 @@
   void RecordBeforeGC(Space space, GCReason reason);
   void RecordAfterGC();
   void PrintStats();
-  void UpdateObjectHistogram();
   void UpdateClassHeapStatsBeforeGC(Heap::Space space);
 
   // The different spaces used for allocation.
diff --git a/runtime/vm/heap_histogram.cc b/runtime/vm/heap_histogram.cc
deleted file mode 100644
index a2043a2..0000000
--- a/runtime/vm/heap_histogram.cc
+++ /dev/null
@@ -1,213 +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.
-
-#include "vm/heap_histogram.h"
-
-#include "platform/assert.h"
-#include "vm/flags.h"
-#include "vm/object.h"
-#include "vm/json_stream.h"
-
-namespace dart {
-
-DEFINE_FLAG(bool, print_object_histogram, false,
-            "Print average object histogram at isolate shutdown");
-
-class ObjectHistogramVisitor : public ObjectVisitor {
- public:
-  explicit ObjectHistogramVisitor(Isolate* isolate) : ObjectVisitor(isolate) { }
-
-  virtual void VisitObject(RawObject* obj) {
-    isolate()->object_histogram()->Add(obj);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ObjectHistogramVisitor);
-};
-
-
-void ObjectHistogram::Collect() {
-  major_gc_count_++;
-  ObjectHistogramVisitor object_visitor(isolate_);
-  isolate_->heap()->IterateObjects(&object_visitor);
-}
-
-
-ObjectHistogram::ObjectHistogram(Isolate* isolate) {
-  isolate_ = isolate;
-  major_gc_count_ = 0;
-  table_length_ = 512;
-  table_ = reinterpret_cast<Element*>(
-    calloc(table_length_, sizeof(Element)));  // NOLINT
-  for (intptr_t index = 0; index < table_length_; index++) {
-    table_[index].class_id_ = index;
-  }
-}
-
-
-ObjectHistogram::~ObjectHistogram() {
-  free(table_);
-}
-
-
-void ObjectHistogram::RegisterClass(const Class& cls) {
-  intptr_t class_id = cls.id();
-  if (class_id < table_length_) return;
-  // Resize the table.
-  intptr_t new_table_length = table_length_ * 2;
-  Element* new_table = reinterpret_cast<Element*>(
-          realloc(table_, new_table_length * sizeof(Element)));  // NOLINT
-  for (intptr_t i = table_length_; i < new_table_length; i++) {
-    new_table[i].class_id_ = i;
-    new_table[i].count_ = 0;
-    new_table[i].size_ = 0;
-  }
-  table_ = new_table;
-  table_length_ = new_table_length;
-  ASSERT(class_id < table_length_);
-}
-
-
-void ObjectHistogram::Add(RawObject* obj) {
-  intptr_t class_id = obj->GetClassId();
-  if (class_id == kFreeListElement) return;
-  ASSERT(class_id < table_length_);
-  table_[class_id].Add(obj->Size());
-}
-
-
-int ObjectHistogram::compare(const Element** a, const Element** b) {
-  // Be careful to return a 32bit integer.
-  intptr_t a_size = (*a)->size_;
-  intptr_t b_size = (*b)->size_;
-  if (a_size > b_size) return -1;
-  if (a_size < b_size) return  1;
-  return 0;
-}
-
-
-ObjectHistogram::Element** ObjectHistogram::GetSortedArray(
-      intptr_t* array_length) {
-  intptr_t length = 0;
-  for (intptr_t index = 0; index < table_length_; index++) {
-    if (table_[index].count_ > 0) length++;
-  }
-  // Then add them to a new array and sort.
-  Element** array = reinterpret_cast<Element**>(
-    calloc(length, sizeof(Element*)));  // NOLINT
-  intptr_t pos = 0;
-  for (intptr_t index = 0; index < table_length_; index++) {
-    if (table_[index].count_ > 0) array[pos++] = &table_[index];
-  }
-  typedef int (*CmpFunc)(const void*, const void*);
-  qsort(array, length, sizeof(Element*),  // NOLINT
-        reinterpret_cast<CmpFunc>(compare));
-
-  *array_length = length;
-  return array;
-}
-
-void ObjectHistogram::Print() {
-  OS::Print("Printing Object Histogram\n");
-  OS::Print("____bytes___count_description____________\n");
-  // First count the number of non empty entries.
-
-  intptr_t length = 0;
-  Element** array = NULL;
-
-  array = GetSortedArray(&length);
-  ASSERT(array != NULL);
-
-  // Finally print the sorted array.
-  Class& cls = Class::Handle();
-  String& str = String::Handle();
-  Library& lib = Library::Handle();
-  for (intptr_t pos = 0; pos < length; pos++) {
-    Element* e = array[pos];
-    if (e->count_ > 0) {
-      cls = isolate_->class_table()->At(e->class_id_);
-      str = cls.Name();
-      lib = cls.library();
-      OS::Print("%9" Pd " %7" Pd " ",
-                e->size_ / major_gc_count_,
-                e->count_ / major_gc_count_);
-      if (e->class_id_ < kInstanceCid) {
-        OS::Print("`%s`", str.ToCString());  // VM names.
-      } else {
-        OS::Print("%s", str.ToCString());
-      }
-      if (lib.IsNull()) {
-        OS::Print("\n");
-      } else {
-        str = lib.url();
-        OS::Print(", library \'%s\'\n", str.ToCString());
-      }
-    }
-  }
-  // Deallocate the array for sorting.
-  free(array);
-}
-
-void ObjectHistogram::PrintToJSONStream(JSONStream* stream) {
-  intptr_t length = 0;
-  Element** array = NULL;
-
-  array = GetSortedArray(&length);
-  ASSERT(array != NULL);
-
-  // Finally print the sorted array.
-  Class& cls = Class::Handle();
-  String& str = String::Handle();
-  Library& lib = Library::Handle();
-
-  intptr_t size_sum = 0;
-  intptr_t count_sum = 0;
-  JSONObject jsobj(stream);
-  jsobj.AddProperty("type", "ObjectHistogram");
-  {  // TODO(johnmccutchan): Why is this empty array needed here?
-    JSONArray jsarr(&jsobj, "properties");
-    jsarr.AddValue("size");
-    jsarr.AddValue("count");
-  }
-  {
-    JSONArray jsarr(&jsobj, "members");
-    for (intptr_t pos = 0; pos < length; pos++) {
-      Element* e = array[pos];
-      if (e->count_ > 0) {
-        cls = isolate_->class_table()->At(e->class_id_);
-        str = cls.Name();
-        lib = cls.library();
-        JSONObject jsobj(&jsarr);
-        jsobj.AddProperty("type", "ObjectHistogramEntry");
-        // It should not be possible to overflow here because the total
-        // size of the heap is bounded and we are dividing the value
-        // by the number of major gcs that have occurred.
-        size_sum += (e->size_ / major_gc_count_);
-        count_sum += (e->count_ / major_gc_count_);
-        jsobj.AddProperty("size", e->size_ / major_gc_count_);
-        jsobj.AddProperty("count", e->count_ / major_gc_count_);
-        jsobj.AddProperty("class", cls, true);
-        jsobj.AddProperty("lib", lib, true);
-        // TODO(johnmccutchan): Update the UI to use the class and lib object
-        // properties above instead of name and category strings.
-        jsobj.AddProperty("name", str.ToCString());
-        if (lib.IsNull()) {
-          jsobj.AddProperty("category", "");
-        } else {
-          str = lib.url();
-          jsobj.AddProperty("category", str.ToCString());
-        }
-      }
-    }
-  }
-  JSONObject sums(&jsobj, "sums");
-  sums.AddProperty("size", size_sum);
-  sums.AddProperty("count", count_sum);
-
-  // Deallocate the array for sorting.
-  free(array);
-}
-
-
-}  // namespace dart
diff --git a/runtime/vm/heap_histogram.h b/runtime/vm/heap_histogram.h
deleted file mode 100644
index 46f6dc1..0000000
--- a/runtime/vm/heap_histogram.h
+++ /dev/null
@@ -1,76 +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.
-
-#ifndef VM_HEAP_HISTOGRAM_H_
-#define VM_HEAP_HISTOGRAM_H_
-
-#include "platform/assert.h"
-#include "vm/flags.h"
-#include "vm/globals.h"
-#include "vm/raw_object.h"
-
-namespace dart {
-
-class JSONStream;
-
-DECLARE_FLAG(bool, print_object_histogram);
-
-// ObjectHistogram is used to compute an average object histogram over
-// the lifetime of an isolate and then print the histogram when the isolate
-// is shut down. Information is gathered at the back-edge of each major GC
-// event. When an object histogram is collected for an isolate, an extra major
-// GC is performed just prior to shutdown.
-class ObjectHistogram {
- public:
-  explicit ObjectHistogram(Isolate* isolate);
-  ~ObjectHistogram();
-
-  // Called when a new class is registered in the isolate.
-  void RegisterClass(const Class& cls);
-
-  // Collect sample for the histogram. Called at back-edge of major GC.
-  void Collect();
-
-  // Print the histogram on stdout.
-  void Print();
-
-  void PrintToJSONStream(JSONStream* stream);
-
- private:
-  // Add obj to histogram
-  void Add(RawObject* obj);
-
-  // For each class an Element keeps track of the accounting.
-  class Element : public ValueObject {
-   public:
-    void Add(int size) {
-      count_++;
-      size_ += size;
-    }
-    intptr_t class_id_;
-    intptr_t count_;
-    intptr_t size_;
-  };
-
-  // Compare function for sorting result.
-  static int compare(const Element** a, const Element** b);
-
-  // This function returns a malloced array. Caller is responsible for calling
-  // free().
-  Element** GetSortedArray(intptr_t* array_length);
-
-  intptr_t major_gc_count_;
-  intptr_t table_length_;
-  Element* table_;
-  Isolate* isolate_;
-
-  friend class ObjectHistogramVisitor;
-
-  DISALLOW_COPY_AND_ASSIGN(ObjectHistogram);
-};
-
-}  // namespace dart
-
-#endif  // VM_HEAP_HISTOGRAM_H_
-
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 117a816..d794a99 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -172,7 +172,6 @@
   V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 2105580462)                \
 
 
-
 // A list of core function that should always be inlined.
 #define INLINE_WHITE_LIST(V)                                                   \
   V(_List, get:length, ObjectArrayLength, 215183186)                           \
@@ -183,6 +182,27 @@
   V(ListIterator, moveNext, ListIteratorMoveNext, 2062984847)                  \
   V(_GrowableList, get:iterator, GrowableArrayIterator, 1155241039)            \
   V(_GrowableList, forEach, GrowableArrayForEach, 195359970)                   \
+  V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 1461569776)                     \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 1318757370)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1107401598)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 377873481)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 436208801)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 1257450859)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 738731818)                          \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1414236073)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1529176866)           \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1902969517)          \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1050460407)                       \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1895506641)                      \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 1428082706)                         \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 266849900)                         \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 1023604903)                         \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 599753059)                         \
   V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 250795553)                  \
   V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 533993880)                 \
   V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 530738523)                    \
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 05c521f..d2b863b 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -16,7 +16,6 @@
 #include "vm/debugger.h"
 #include "vm/deopt_instructions.h"
 #include "vm/heap.h"
-#include "vm/heap_histogram.h"
 #include "vm/message_handler.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_store.h"
@@ -47,7 +46,16 @@
 
 void Isolate::RegisterClass(const Class& cls) {
   class_table()->Register(cls);
-  if (object_histogram() != NULL) object_histogram()->RegisterClass(cls);
+}
+
+
+void Isolate::RegisterClassAt(intptr_t index, const Class& cls) {
+  class_table()->RegisterAt(index, cls);
+}
+
+
+void Isolate::ValidateClassTable() {
+  class_table()->Validate();
 }
 
 
@@ -314,7 +322,6 @@
       deopt_context_(NULL),
       stacktrace_(NULL),
       stack_frame_index_(-1),
-      object_histogram_(NULL),
       cha_used_(false),
       object_id_ring_(NULL),
       profiler_data_(NULL),
@@ -322,9 +329,6 @@
       next_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
       reusable_handles_() {
-  if (FLAG_print_object_histogram && (Dart::vm_isolate() != NULL)) {
-    object_histogram_ = new ObjectHistogram(this);
-  }
 }
 #undef REUSABLE_HANDLE_INITIALIZERS
 
@@ -344,7 +348,6 @@
   delete message_handler_;
   message_handler_ = NULL;  // Fail fast if we send messages to a dead isolate.
   ASSERT(deopt_context_ == NULL);  // No deopt in progress when isolate deleted.
-  delete object_histogram_;
   delete spawn_state_;
 }
 
@@ -750,11 +753,6 @@
     StackZone stack_zone(this);
     HandleScope handle_scope(this);
 
-    if (FLAG_print_object_histogram) {
-      heap()->CollectAllGarbage();
-      object_histogram()->Print();
-    }
-
     // Clean up debugger resources.
     debugger()->Shutdown();
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 9253476..77544cd 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -60,7 +60,6 @@
 class StubCode;
 class TypeArguments;
 class TypeParameter;
-class ObjectHistogram;
 class ObjectIdRing;
 
 
@@ -104,6 +103,8 @@
 
   // Register a newly introduced class.
   void RegisterClass(const Class& cls);
+  void RegisterClassAt(intptr_t index, const Class& cls);
+  void ValidateClassTable();
 
   // Visit all object pointers.
   void VisitObjectPointers(ObjectPointerVisitor* visitor,
@@ -124,8 +125,6 @@
     return OFFSET_OF(Isolate, class_table_);
   }
 
-  ObjectHistogram* object_histogram() { return object_histogram_; }
-
   bool cha_used() const { return cha_used_; }
   void set_cha_used(bool value) { cha_used_ = value; }
 
@@ -489,7 +488,6 @@
   // Status support.
   char* stacktrace_;
   intptr_t stack_frame_index_;
-  ObjectHistogram* object_histogram_;
 
   bool cha_used_;
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 15cc8a2..ba744e3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3266,7 +3266,8 @@
                                  Error* bound_error) {
   // Use the thsi object as if it was the receiver of this method, but instead
   // of recursing reset it to the super class and loop.
-  Class& thsi = Class::Handle(cls.raw());
+  Isolate* isolate = Isolate::Current();
+  Class& thsi = Class::Handle(isolate, cls.raw());
   while (true) {
     ASSERT(!thsi.IsVoidClass());
     // Check for DynamicType.
@@ -3323,13 +3324,15 @@
     }
     const bool other_is_function_class = other.IsFunctionClass();
     if (other.IsSignatureClass() || other_is_function_class) {
-      const Function& other_fun = Function::Handle(other.signature_function());
+      const Function& other_fun = Function::Handle(isolate,
+                                                   other.signature_function());
       if (thsi.IsSignatureClass()) {
         if (other_is_function_class) {
           return true;
         }
         // Check for two function types.
-        const Function& fun = Function::Handle(thsi.signature_function());
+        const Function& fun =
+            Function::Handle(isolate, thsi.signature_function());
         return fun.TypeTest(test_kind,
                             type_arguments,
                             other_fun,
@@ -3338,10 +3341,11 @@
       }
       // Check if type S has a call() method of function type T.
       Function& function =
-      Function::Handle(thsi.LookupDynamicFunction(Symbols::Call()));
+          Function::Handle(isolate,
+                           thsi.LookupDynamicFunction(Symbols::Call()));
       if (function.IsNull()) {
         // Walk up the super_class chain.
-        Class& cls = Class::Handle(thsi.SuperClass());
+        Class& cls = Class::Handle(isolate, thsi.SuperClass());
         while (!cls.IsNull() && function.IsNull()) {
           function = cls.LookupDynamicFunction(Symbols::Call());
           cls = cls.SuperClass();
@@ -3360,11 +3364,11 @@
     }
     // Check for 'direct super type' specified in the implements clause
     // and check for transitivity at the same time.
-    Array& interfaces = Array::Handle(thsi.interfaces());
-    AbstractType& interface = AbstractType::Handle();
-    Class& interface_class = Class::Handle();
-    TypeArguments& interface_args = TypeArguments::Handle();
-    Error& error = Error::Handle();
+    Array& interfaces = Array::Handle(isolate, thsi.interfaces());
+    AbstractType& interface = AbstractType::Handle(isolate);
+    Class& interface_class = Class::Handle(isolate);
+    TypeArguments& interface_args = TypeArguments::Handle(isolate);
+    Error& error = Error::Handle(isolate);
     for (intptr_t i = 0; i < interfaces.Length(); i++) {
       interface ^= interfaces.At(i);
       if (!interface.IsFinalized()) {
@@ -6397,9 +6401,15 @@
   }
 
   jsobj.AddProperty("owner", cls);
+
+  // TODO(turnidge): Once the vmservice supports returning types,
+  // return the type here instead of the class.
   AbstractType& declared_type = AbstractType::Handle(type());
-  cls = declared_type.type_class();
-  jsobj.AddProperty("declared_type", cls);
+  if (declared_type.HasResolvedTypeClass()) {
+    cls = declared_type.type_class();
+    jsobj.AddProperty("declared_type", cls);
+  }
+
   jsobj.AddProperty("static", is_static());
   jsobj.AddProperty("final", is_final());
   jsobj.AddProperty("const", is_const());
@@ -10954,10 +10964,12 @@
 
 
 RawFunction* ICData::GetTargetAt(intptr_t index) const {
-  const Array& data = Array::Handle(ic_data());
   const intptr_t data_pos = index * TestEntryLength() + num_args_tested();
-  ASSERT(Object::Handle(data.At(data_pos)).IsFunction());
-  return reinterpret_cast<RawFunction*>(data.At(data_pos));
+  ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction());
+
+  NoGCScope no_gc;
+  RawArray* raw_data = ic_data();
+  return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]);
 }
 
 
@@ -11295,8 +11307,9 @@
 
 
 intptr_t SubtypeTestCache::NumberOfChecks() const {
+  NoGCScope no_gc;
   // Do not count the sentinel;
-  return (Array::Handle(cache()).Length() / kTestEntryLength) - 1;
+  return (Smi::Value(cache()->ptr()->length_) / kTestEntryLength) - 1;
 }
 
 
@@ -16245,20 +16258,19 @@
 
 
 RawArray* Array::New(intptr_t class_id, intptr_t len, Heap::Space space) {
-  if (len < 0 || len > Array::kMaxElements) {
+  if ((len < 0) || (len > Array::kMaxElements)) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in Array::New: invalid len %" Pd "\n", len);
   }
-  Array& result = Array::Handle();
   {
-    RawObject* raw = Object::Allocate(class_id,
-                                      Array::InstanceSize(len),
-                                      space);
+    RawArray* raw = reinterpret_cast<RawArray*>(
+        Object::Allocate(class_id,
+                         Array::InstanceSize(len),
+                         space));
     NoGCScope no_gc;
-    result ^= raw;
-    result.SetLength(len);
+    raw->ptr()->length_ = Smi::New(len);
+    return raw;
   }
-  return result.raw();
 }
 
 
diff --git a/runtime/vm/object_id_ring.cc b/runtime/vm/object_id_ring.cc
index 434463b..fd06988 100644
--- a/runtime/vm/object_id_ring.cc
+++ b/runtime/vm/object_id_ring.cc
@@ -33,7 +33,8 @@
 RawObject* ObjectIdRing::GetObjectForId(int32_t id) {
   int32_t index = IndexOfId(id);
   if (index == kInvalidId) {
-    return Object::null();
+    // Return sentinel to allow caller to distinguish expired ids.
+    return Object::sentinel().raw();
   }
   ASSERT(index >= 0);
   ASSERT(index < capacity_);
diff --git a/runtime/vm/object_id_ring.h b/runtime/vm/object_id_ring.h
index b0dfee7..ee9038d 100644
--- a/runtime/vm/object_id_ring.h
+++ b/runtime/vm/object_id_ring.h
@@ -28,6 +28,8 @@
   ~ObjectIdRing();
 
   int32_t GetIdForObject(RawObject* raw_obj);
+
+  // Returns Object::sentinel() when the id is not valid.
   RawObject* GetObjectForId(int32_t id);
 
   void VisitPointers(ObjectPointerVisitor* visitor);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index de9405d..1cf58b5 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -380,8 +380,8 @@
 
 
 String* Parser::CurrentLiteral() const {
-  String& result = String::ZoneHandle();
-  result = tokens_iterator_.CurrentLiteral();
+  String& result =
+      String::ZoneHandle(isolate_, tokens_iterator_.CurrentLiteral());
   return &result;
 }
 
@@ -4855,20 +4855,6 @@
 }
 
 
-class DartApiScope : public StackResource {
- public:
-  explicit DartApiScope(Isolate* isolate) : StackResource(isolate) {
-    Dart_EnterScope();
-  }
-  ~DartApiScope() {
-    Dart_ExitScope();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DartApiScope);
-};
-
-
 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
                                          intptr_t token_pos,
                                          const String& url) {
@@ -4885,7 +4871,7 @@
   // Block class finalization attempts when calling into the library
   // tag handler.
   isolate()->BlockClassFinalization();
-  DartApiScope api_scope(isolate());
+  Api::Scope api_scope(isolate());
   Dart_Handle result = handler(tag,
                                Api::NewHandle(isolate(), library_.raw()),
                                Api::NewHandle(isolate(), url.raw()));
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index c8a2374..53bc048 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -198,6 +198,7 @@
       end_(end),
       inclusive_ticks_(0),
       exclusive_ticks_(0),
+      inclusive_tick_serial_(0),
       name_(NULL),
       address_table_(new ZoneGrowableArray<AddressEntry>()),
       callers_table_(new ZoneGrowableArray<CallEntry>()),
@@ -311,6 +312,8 @@
     }
     AddressEntry entry;
     entry.pc = pc;
+    entry.exclusive_ticks = 0;
+    entry.inclusive_ticks = 0;
     entry.tick(exclusive);
     if (i < length) {
       // Insert at i.
@@ -699,9 +702,18 @@
                          ProfilerCodeRegionTable* code_region_table)
       : SampleVisitor(isolate), code_region_table_(code_region_table) {
     frames_ = 0;
+    min_time_ = kMaxInt64;
+    max_time_ = 0;
   }
 
   void VisitSample(Sample* sample) {
+    int64_t timestamp = sample->timestamp();
+    if (timestamp > max_time_) {
+      max_time_ = timestamp;
+    }
+    if (timestamp < min_time_) {
+      min_time_ = timestamp;
+    }
     // Give the bottom frame an exclusive tick.
     code_region_table_->AddTick(sample->At(0), true, -1);
     // Give all frames (including the bottom) an inclusive tick.
@@ -715,9 +727,15 @@
   }
 
   intptr_t frames() const { return frames_; }
+  intptr_t  TimeDeltaMicros() const {
+    return static_cast<intptr_t>(max_time_ - min_time_);
+  }
+  int64_t  max_time() const { return max_time_; }
 
  private:
   intptr_t frames_;
+  int64_t min_time_;
+  int64_t max_time_;
   ProfilerCodeRegionTable* code_region_table_;
 };
 
@@ -807,6 +825,7 @@
         JSONObject obj(stream);
         obj.AddProperty("type", "Profile");
         obj.AddProperty("samples", samples);
+        obj.AddProperty("time_delta_micros", builder.TimeDeltaMicros());
         JSONArray codes(&obj, "codes");
         for (intptr_t i = 0; i < code_region_table.Length(); i++) {
           CodeRegion* region = code_region_table.At(i);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 0910e90..21f97e2 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -447,7 +447,6 @@
   friend class ClassStatsVisitor;
   friend class MarkingVisitor;
   friend class Object;
-  friend class ObjectHistogram;
   friend class RawExternalTypedData;
   friend class RawInstructions;
   friend class RawInstance;
@@ -1384,6 +1383,8 @@
   friend class SnapshotReader;
   friend class GrowableObjectArray;
   friend class Object;
+  friend class ICData;  // For high performance access.
+  friend class SubtypeTestCache;  // For high performance access.
 };
 
 
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 40d6a86..1019498 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -12,7 +12,6 @@
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
-#include "vm/heap_histogram.h"
 #include "vm/isolate.h"
 #include "vm/message.h"
 #include "vm/native_entry.h"
@@ -619,19 +618,6 @@
 }
 
 
-static bool HandleObjectHistogram(Isolate* isolate, JSONStream* js) {
-  ObjectHistogram* histogram = Isolate::Current()->object_histogram();
-  if (histogram == NULL) {
-    JSONObject jsobj(js);
-    jsobj.AddProperty("type", "Error");
-    jsobj.AddProperty("text", "Run with --print_object_histogram");
-    return true;
-  }
-  histogram->PrintToJSONStream(js);
-  return true;
-}
-
-
 static bool HandleIsolateEcho(Isolate* isolate, JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "message");
@@ -871,6 +857,16 @@
 }
 
 
+static void PrintPseudoNull(JSONStream* js,
+                            const char* id,
+                            const char* preview) {
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "Null");
+  jsobj.AddProperty("id", id);
+  jsobj.AddProperty("preview", preview);
+}
+
+
 static bool HandleObjects(Isolate* isolate, JSONStream* js) {
   REQUIRE_COLLECTION_ID("objects");
   ASSERT(js->num_arguments() >= 2);
@@ -878,13 +874,30 @@
 
   // TODO(turnidge): Handle <optimized out> the same way as other
   // special nulls.
-  if (strcmp(arg, "null") == 0 ||
-      strcmp(arg, "not-initialized") == 0 ||
-      strcmp(arg, "being-initialized") == 0 ||
-      strcmp(arg, "optimized-out") == 0) {
+  if (strcmp(arg, "null") == 0) {
     Object::null_object().PrintToJSONStream(js, false);
     return true;
 
+  } else if (strcmp(arg, "not-initialized") == 0) {
+    Object::sentinel().PrintToJSONStream(js, false);
+    return true;
+
+  } else if (strcmp(arg, "being-initialized") == 0) {
+    Object::transition_sentinel().PrintToJSONStream(js, false);
+    return true;
+
+  } else if (strcmp(arg, "optimized-out") == 0) {
+    Symbols::OptimizedOut().PrintToJSONStream(js, false);
+    return true;
+
+  } else if (strcmp(arg, "collected") == 0) {
+    PrintPseudoNull(js, "objects/collected", "<collected>");
+    return true;
+
+  } else if (strcmp(arg, "expired") == 0) {
+    PrintPseudoNull(js, "objects/expired", "<expired>");
+    return true;
+
   } else if (strcmp(arg, "int") == 0) {
     if (js->num_arguments() < 3) {
       PrintError(js, "expected 3 arguments but found %" Pd "\n",
@@ -931,6 +944,15 @@
     return true;
   }
   Object& obj = Object::Handle(ring->GetObjectForId(id));
+  if (obj.IsNull()) {
+    // The object has been collected by the gc.
+    PrintPseudoNull(js, "objects/collected", "<collected>");
+    return true;
+  } else if (obj.raw() == Object::sentinel().raw()) {
+    // The object id has expired.
+    PrintPseudoNull(js, "objects/expired", "<expired>");
+    return true;
+  }
   obj.PrintToJSONStream(js, false);
   return true;
 }
@@ -1106,7 +1128,10 @@
 
 
 static bool HandleProfile(Isolate* isolate, JSONStream* js) {
-  Profiler::PrintToJSONStream(isolate, js, true);
+  // 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);
   return true;
 }
 
@@ -1154,7 +1179,6 @@
   { "cpu", HandleCpu },
   { "debug", HandleDebug },
   { "libraries", HandleLibraries },
-  { "objecthistogram", HandleObjectHistogram},
   { "objects", HandleObjects },
   { "profile", HandleProfile },
   { "unpin", HandleUnpin },
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index dec7c90..29d9792 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -380,6 +380,11 @@
     }
   }
 
+  // Validate the class table.
+#if defined(DEBUG)
+  isolate->ValidateClassTable();
+#endif
+
   // Setup native resolver for bootstrap impl.
   Bootstrap::SetupNativeResolver();
 }
@@ -472,8 +477,8 @@
   Instance fake;
   obj->ptr()->handle_vtable_ = fake.vtable();
   cls_ = obj;
-  cls_.set_id(kIllegalCid);
-  isolate()->RegisterClass(cls_);
+  cls_.set_id(class_id);
+  isolate()->RegisterClassAt(class_id, cls_);
   return cls_.raw();
 }
 
@@ -1121,6 +1126,12 @@
   ASSERT(object_store != NULL);
   ASSERT(ClassFinalizer::AllClassesFinalized());
 
+  // Ensure the class table is valid.
+#if defined(DEBUG)
+  isolate->ValidateClassTable();
+#endif
+
+
   // Setup for long jump in case there is an exception while writing
   // the snapshot.
   LongJumpScope jump;
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 65cd91c..2481ac61 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -192,8 +192,6 @@
     'hash_map_test.cc',
     'heap.cc',
     'heap.h',
-    'heap_histogram.cc',
-    'heap_histogram.h',
     'heap_test.cc',
     'il_printer.cc',
     'il_printer.h',
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 83af12a..53a6362 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -40,7 +40,6 @@
   /** Returns true if the constant is a list, a map or a constructed object. */
   bool isObject() => false;
   bool isType() => false;
-  bool isSentinel() => false;
   bool isInterceptor() => false;
   bool isDummy() => false;
 
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 159b07e..37c54b5 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -52,10 +52,11 @@
 var esc = const HtmlEscape().convert;
 
 String sizeDescription(int size, ProgramInfo programInfo) {
-  return size == null
-      ? ''
-      : span('${size} bytes '
-        '(${size * 100 ~/ programInfo.size}%)', cls: "size");
+  if (size == null) {
+    return '';
+  }
+  return span(span(size.toString(), cls: 'value') +
+      ' bytes (${size * 100 ~/ programInfo.size}%)', cls: 'size');
 }
 
 /// An [InfoNode] holds information about a part the program.
@@ -64,7 +65,8 @@
 
   int get size;
 
-  void emitHtml(ProgramInfo programInfo, StringSink buffer);
+  void emitHtml(ProgramInfo programInfo, StringSink buffer,
+      [String indentation = '']);
 }
 
 /// An [ElementNode] holds information about an [Element]
@@ -103,7 +105,8 @@
       this.contents,
       this.extra: ""});
 
-  void emitHtml(ProgramInfo programInfo, StringSink buffer) {
+  void emitHtml(ProgramInfo programInfo, StringSink buffer,
+      [String indentation = '']) {
     String kindString = span(esc(kind), cls: 'kind');
     String modifiersString = span(esc(modifiers), cls: "modifiers");
 
@@ -121,17 +124,23 @@
         extraString].join(' ');
 
     if (contents != null) {
+      buffer.write(indentation);
+      buffer.write('<div class="container">\n');
+      buffer.write('$indentation  ');
+      buffer.write(div('+$describe', cls: "details"));
       buffer.write('\n');
-      buffer.write(div("+$describe", cls: "container"));
-      buffer.write('\n');
-      buffer.write('<div class="contained">');
+      buffer.write('$indentation  <div class="contents">');
       if (contents.isEmpty) {
-        buffer.writeln("No members");
+        buffer.write('No members</div>');
+      } else {
+        buffer.write('\n');
+        for (InfoNode subElementDescription in contents) {
+          subElementDescription.emitHtml(programInfo, buffer,
+              indentation + '    ');
+        }
+        buffer.write("\n$indentation  </div>");
       }
-      for (InfoNode subElementDescription in contents) {
-        subElementDescription.emitHtml(programInfo, buffer);
-      }
-      buffer.write("</div>");
+      buffer.write("\n$indentation</div>\n");
     } else {
       buffer.writeln(div('$describe', cls: "element"));
     }
@@ -151,12 +160,14 @@
 
   CodeInfoNode({this.description: "", this.generatedCode});
 
-  void emitHtml(ProgramInfo programInfo, StringBuffer buffer) {
-    buffer.write('\n');
+  void emitHtml(ProgramInfo programInfo, StringBuffer buffer,
+      [String indentation = '']) {
+    buffer.write(indentation);
     buffer.write(div(description + ' ' +
                      sizeDescription(generatedCode.length, programInfo),
                      cls: 'kind') +
         code(esc(generatedCode)));
+    buffer.write('\n');
   }
 }
 
@@ -177,13 +188,15 @@
 
   InferredInfoNode({this.name: "", this.description, this.type});
 
-  void emitHtml(ProgramInfo programInfo, StringSink buffer) {
-    buffer.write('\n');
+  void emitHtml(ProgramInfo programInfo, StringBuffer buffer,
+      [String indentation = '']) {
+    buffer.write(indentation);
     buffer.write(
         div('${span("Inferred " + description, cls: "kind")} '
             '${span(esc(name), cls: "name")} '
             '${span(esc(type), cls: "type")} ',
             cls: "attr"));
+    buffer.write('\n');
   }
 }
 
@@ -279,7 +292,7 @@
       return null;
     }
     int size = 0;
-    DartType type = element.computeType(compiler);
+    DartType type = element.variables.type;
     List<InfoNode> contents = new List<InfoNode>();
     if (emittedCode != null) {
       contents.add(new CodeInfoNode(
@@ -463,20 +476,23 @@
   <head>
     <title>Dart2JS compilation information</title>
        <style>
-         code {margin-left: 20px; display: block; white-space: pre; }
-         div.container, div.contained, div.element, div.attr {
-           margin-top:0px;
-           margin-bottom: 0px;
-         }
-         div.container, div.element, div.attr {
-           white-space: pre;
-         }
-         div.contained {margin-left: 20px;}
-         div {/*border: 1px solid;*/}
-         span.kind {}
-         span.modifiers {font-weight:bold;}
-         span.name {font-weight:bold; font-family: monospace;}
-         span.type {font-family: monospace; color:blue;}
+        code {margin-left: 20px; display: block; white-space: pre; }
+        div.container, div.contained, div.element, div.attr {
+          margin-top:0px;
+          margin-bottom: 0px;
+        }
+        div.container, div.element, div.attr {
+          white-space: nowrap;
+        }
+        .contents {
+          margin-left: 20px;
+        }
+        div.contained {margin-left: 20px;}
+        div {/*border: 1px solid;*/}
+        span.kind {}
+        span.modifiers {font-weight:bold;}
+        span.name {font-weight:bold; font-family: monospace;}
+        span.type {font-family: monospace; color:blue;}
        </style>
      </head>
      <body>
@@ -490,10 +506,13 @@
       buffer.writeln(h2('Dart2js version: ${info.dart2jsVersion}'));
     }
 
+    buffer.writeln('<a href="#" class="sort_by_size">Sort by size</a>\n');
+
+    buffer.writeln('<div class="contents">');
     info.libraries.forEach((InfoNode node) {
       node.emitHtml(info, buffer);
     });
-
+    buffer.writeln('</div>');
 
     // TODO (sigurdm): This script should be written in dart
     buffer.writeln(r"""
@@ -506,10 +525,72 @@
       var containers = document.getElementsByClassName('container');
       for (var i = 0; i < containers.length; i++) {
         var container = containers[i];
-        container.addEventListener('click',
-          toggler(container.nextElementSibling), false);
-       container.nextElementSibling.hidden = true;
-      };
+        container.querySelector('.details').addEventListener('click',
+          toggler(container.querySelector('.contents')), false);
+        container.querySelector('.contents').hidden = true;
+      }
+
+      function sortBySize() {
+        var toSort = document.querySelectorAll('.contents');
+        for (var i = 0; i < toSort.length; ++i) {
+          sortNodes(toSort[i], function(a, b) {
+            if (a[1] !== b[1]) {
+              return a[1] > b[1] ? -1 : 1;
+            }
+            return a[2] === b[2] ? 0 : a[2] > b[2] ? 1 : -1;
+          });
+        }
+      }
+
+      function findSize(node) {
+        var size = 0;
+        var details = node.querySelector('.details');
+        if (details) {
+          var sizeElement = details.querySelector('.size');
+          if (sizeElement) {
+            size = parseInt(sizeElement.textContent);
+          } else {
+            // For classes, sum up the contents for sorting purposes.
+            var kind = details.querySelector('.kind');
+            if (kind && kind.textContent === 'class') {
+              var contents = node.querySelector('.contents');
+              if (contents) {
+                var child = contents.firstElementChild;
+                while (child) {
+                  size += findSize(child);
+                  child = child.nextElementSibling;
+                }
+              }
+            }
+          }
+        }
+        return size;
+      }
+
+      function findName(node) {
+        var name = '';
+        var nameNode = node.querySelector('.name');
+        if (nameNode) {
+          return nameNode.textContent;
+        }
+        return node.textContent;
+      }
+      function sortNodes(node, fn) {
+        var items = [];
+        var child = node.firstElementChild;
+        while (child) {
+          items.push([child, findSize(child), findName(child)]);
+          child = child.nextElementSibling;
+        }
+        items.sort(fn);
+        for (var i = 0; i < items.length; ++i) {
+          node.appendChild(items[i][0]);
+        }
+      }
+      document.querySelector('.sort_by_size').addEventListener('click',
+          function() {
+            sortBySize();
+          }, false);
     </script>
   </body>
 </html>""");
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 902ca67..3a9c4c7 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -183,7 +183,17 @@
   Link<MetadataAnnotation> get metadata;
 
   Node parseNode(DiagnosticListener listener);
-  DartType computeType(Compiler compiler);
+
+  /// 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.
+  /// - `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
+  /// error and calling [computeType] covers that error.
+  /// This method will go away!
+  @deprecated DartType computeType(Compiler compiler);
 
   bool isFunction();
   bool isConstructor();
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/ir_type_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/ir_type_inferrer.dart
deleted file mode 100644
index f85e1be..0000000
--- a/sdk/lib/_internal/compiler/implementation/inferrer/ir_type_inferrer.dart
+++ /dev/null
@@ -1,119 +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.
-
-library dart2js.ir_type_inferrer;
-
-import '../ir/ir_nodes.dart' as ir;
-import 'inferrer_visitor.dart' show TypeSystem, ArgumentsTypes;
-import 'simple_types_inferrer.dart' show InferrerEngine;
-import '../elements/elements.dart' show
-    Elements, Element, FunctionElement, FunctionSignature;
-import '../dart2jslib.dart' show Compiler, Constant, ConstantSystem;
-import 'type_graph_inferrer.dart' show TypeInformation;
-import '../universe/universe.dart' show Selector, SideEffects;
-
-
-class IrTypeInferrerVisitor extends ir.NodesVisitor {
-  final Compiler compiler;
-  final Element analyzedElement;
-  final Element outermostElement;
-  final InferrerEngine<TypeInformation, TypeSystem<TypeInformation>> inferrer;
-  final TypeSystem<TypeInformation> types;
-
-  IrTypeInferrerVisitor(this.compiler,
-                        Element analyzedElement,
-                        InferrerEngine<TypeInformation,
-                        TypeSystem<TypeInformation>> inferrer)
-    : this.analyzedElement = analyzedElement,
-      outermostElement = _outermostElement(analyzedElement),
-      this.inferrer = inferrer,
-      types = inferrer.types;
-
-  final SideEffects sideEffects = new SideEffects.empty();
-  bool inLoop = false;
-
-  static Element _outermostElement(Element analyzedElememnt) {
-    Element outermostElement =
-        analyzedElememnt.getOutermostEnclosingMemberOrTopLevel().implementation;
-    assert(outermostElement != null);
-    return outermostElement;
-  }
-
-  final Map<ir.Node, TypeInformation> analyzed = <ir.Node, TypeInformation>{};
-
-  TypeInformation returnType;
-
-  TypeInformation run() {
-    // TODO(lry): handle fields.
-    assert(!analyzedElement.isField());
-
-    FunctionElement function = analyzedElement;
-    FunctionSignature signature = function.computeSignature(compiler);
-    ir.Function node = compiler.irBuilder.getIr(function);
-
-    // TODO(lry): handle parameters.
-    assert(function.computeSignature(compiler).parameterCount == 0);
-    // TODO(lry): handle native.
-    assert(!function.isNative());
-    // TODO(lry): handle constructors.
-    assert(!analyzedElement.isGenerativeConstructor());
-    // TODO(lry): handle synthethics.
-    assert(!analyzedElement.isSynthesized);
-
-    visitAll(node.statements);
-    compiler.world.registerSideEffects(analyzedElement, sideEffects);
-    return returnType;
-  }
-
-  TypeInformation typeOfConstant(Constant constant) {
-    return inferrer.types.getConcreteTypeFor(constant.computeMask(compiler));
-  }
-
-  TypeInformation handleStaticSend(ir.Node node,
-                                   Selector selector,
-                                   Element element,
-                                   ArgumentsTypes arguments) {
-    return inferrer.registerCalledElement(
-        node, selector, outermostElement, element, arguments,
-        sideEffects, inLoop);
-  }
-
-  ArgumentsTypes<TypeInformation> analyzeArguments(
-      Selector selector, List<ir.Node> arguments) {
-    // TODO(lry): support named arguments, necessary information should be
-    // in [selector].
-    assert(selector.namedArgumentCount == 0);
-    List<TypeInformation> positional =
-        arguments.map((e) => analyzed[e]).toList(growable: false);
-    return new ArgumentsTypes<TypeInformation>(positional, null);
-  }
-
-  void visitConstant(ir.Constant node) {
-    analyzed[node] = typeOfConstant(node.value);
-  }
-
-  void visitReturn(ir.Return node) {
-    TypeInformation type = analyzed[node.value];
-    returnType = inferrer.addReturnTypeFor(analyzedElement, returnType, type);
-  }
-
-  void visitInvokeStatic(ir.InvokeStatic node) {
-    FunctionElement element = node.target;
-    Selector selector = node.selector;
-    // TODO(lry): handle foreign functions.
-    assert(!element.isForeign(compiler));
-    // In erroneous code the number of arguments in the selector might not
-    // match the function element.
-    if (!selector.applies(element, compiler)) {
-      analyzed[node] = types.dynamicType;
-    } else {
-      ArgumentsTypes arguments = analyzeArguments(selector, node.arguments);
-      analyzed[node] = handleStaticSend(node, selector, element, arguments);
-    }
-  }
-
-  void visitNode(ir.Node node) {
-    compiler.internalError('Unexpected IrNode $node');
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index f901806..2f0f639 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -31,7 +31,7 @@
  * re-implemented to work directly on the IR.
  */
 class IrBuilderTask extends CompilerTask {
-  final Map<Element, ir.Node> nodes = new Map<Element, ir.Node>();
+  final Map<Element, ir.Function> nodes = <Element, ir.Function>{};
 
   IrBuilderTask(Compiler compiler) : super(compiler);
 
@@ -39,7 +39,7 @@
 
   bool hasIr(Element element) => nodes.containsKey(element.implementation);
 
-  ir.Node getIr(Element element) => nodes[element.implementation];
+  ir.Function getIr(Element element) => nodes[element.implementation];
 
   void buildNodes() {
     if (!irEnabled()) return;
@@ -51,9 +51,9 @@
           element = element.implementation;
 
           SourceFile sourceFile = elementSourceFile(element);
-          IrNodeBuilderVisitor visitor =
-              new IrNodeBuilderVisitor(elementsMapping, compiler, sourceFile);
-          ir.Node irNode;
+          IrBuilder builder =
+              new IrBuilder(elementsMapping, compiler, sourceFile);
+          ir.Function function;
           ElementKind kind = element.kind;
           if (kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
             // TODO(lry): build ir for constructors.
@@ -61,7 +61,7 @@
               kind == ElementKind.FUNCTION ||
               kind == ElementKind.GETTER ||
               kind == ElementKind.SETTER) {
-            irNode = visitor.buildMethod(element);
+            function = builder.buildFunction(element);
           } else if (kind == ElementKind.FIELD) {
             // TODO(lry): build ir for lazy initializers of static fields.
           } else {
@@ -69,16 +69,16 @@
                 'unexpected element kind $kind');
           }
 
-          if (irNode != null) {
+          if (function != null) {
             assert(() {
               // In host-checked mode, serialize and de-serialize the IrNode.
               LibraryElement library = element.declaration.getLibrary();
               IrConstantPool constantPool = IrConstantPool.forLibrary(library);
-              List<int> data = irNode.pickle(constantPool);
-              irNode = new Unpickler(compiler, constantPool).unpickle(data);
+              List<int> data = function.pickle(constantPool);
+              function = new Unpickler(compiler, constantPool).unpickle(data);
               return true;
             });
-            nodes[element] = irNode;
+            nodes[element] = function;
           }
         }
         ensureIr(element);
@@ -183,117 +183,168 @@
  * to the [builder] and return the last added statement for trees that represent
  * an expression.
  */
-class IrNodeBuilderVisitor extends ResolvedVisitor<ir.Node> {
+class IrBuilder extends ResolvedVisitor<ir.Trivial> {
   final SourceFile sourceFile;
-
-  IrNodeBuilderVisitor(
-      TreeElements elements,
-      Compiler compiler,
-      this.sourceFile)
-    : super(elements, compiler);
-
-  IrBuilder builder;
+  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
+  // and 'current' which is the expression that immediately contains the hole.
+  // Not all expressions have a hole (e.g., invocations, which always occur in
+  // tail position, do not have a hole).  Expressions with a hole have a plug
+  // method.
+  //
+  // Conceptually, visiting a statement takes a context as input and returns
+  // either a new context or else an expression without a hole if all
+  // control-flow paths through the statement have exited.  An expression
+  // without a hole is represented by a (root, current) pair where root is the
+  // 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
+  // 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.
+  ir.Expression root = null;
+  ir.Expression current = null;
+  
+  IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
+      : super(elements, compiler);
 
   /**
    * Builds the [ir.Function] for a function element. In case the function
    * uses features that cannot be expressed in the IR, this function returns
    * [:null:].
    */
-  ir.Function buildMethod(FunctionElement functionElement) {
-    return nullIfGiveup(() => buildMethodInternal(functionElement));
+  ir.Function buildFunction(FunctionElement functionElement) {
+    return nullIfGiveup(() => buildFunctionInternal(functionElement));
   }
 
-  ir.Function buildMethodInternal(FunctionElement functionElement) {
+  ir.Function buildFunctionInternal(FunctionElement functionElement) {
     assert(invariant(functionElement, functionElement.isImplementation));
     ast.FunctionExpression function = functionElement.parseNode(compiler);
     assert(function != null);
     assert(!function.modifiers.isExternal());
     assert(elements[function] != null);
 
+    returnContinuation = new ir.Continuation.retrn();
+    root = current = null;
+    function.body.accept(this);
+    ensureReturn(function);
     int endPosition = function.getEndToken().charOffset;
     int namePosition = elements[function].position().charOffset;
-    ir.Function result = new ir.Function(
-        nodePosition(function), endPosition, namePosition, <ir.Node>[]);
-    builder = new IrBuilder(this);
-    builder.enterBlock();
-    if (function.hasBody()) {
-      function.body.accept(this);
-      ensureReturn(function);
-      result.statements
-        ..addAll(builder.constants.values)
-        ..addAll(builder.block.statements);
-    }
-    builder.exitBlock();
-    return result;
+    return
+        new ir.Function(endPosition, namePosition, returnContinuation, root);
   }
 
   ConstantSystem get constantSystem => compiler.backend.constantSystem;
 
-  /* int | PositionWithIdentifierName */ nodePosition(ast.Node node) {
-    Token token = node.getBeginToken();
-    if (token.isIdentifier()) {
-      return new ir.PositionWithIdentifierName(token.charOffset, token.value);
-    } else {
-      return token.charOffset;
+  bool get isOpen => root == null || current != null;
+
+  // Plug an expression into the 'hole' in the context being accumulated.  The
+  // empty context (just a hole) is represented by root (and current) being
+  // null.  Since the hole in the current context is filled by this function,
+  // the new hole must be in the newly added expression---which becomes the
+  // new value of current.
+  void add(ir.Expression expr) {
+    if (root == null) {
+      root = current = expr;
+    } else if (current != null) {
+      current = current.plug(expr);
     }
   }
-
-  bool get blockReturns => builder.block.hasReturn;
-
+  
   /**
    * Add an explicit [:return null:] for functions that don't have a return
    * statement on each branch. This includes functions with an empty body,
    * such as [:foo(){ }:].
    */
   void ensureReturn(ast.FunctionExpression node) {
-    if (blockReturns) return;
-    ir.Constant nullValue =
-        builder.addConstant(constantSystem.createNull(), node);
-    builder.addStatement(new ir.Return(nodePosition(node), nullValue));
+    if (!isOpen) return;
+    ir.Constant constant = new ir.Constant(constantSystem.createNull());
+    add(new ir.LetVal(constant));
+    add(new ir.InvokeContinuation(returnContinuation, constant));
+    current = null;
+  }
+  
+  ir.Trivial visitEmptyStatement(ast.EmptyStatement node) {
+    assert(isOpen);
+    return null;
   }
 
-  ir.Node visitBlock(ast.Block node) {
-    for (ast.Node n in node.statements.nodes) {
+  ir.Trivial visitBlock(ast.Block node) {
+    assert(isOpen);
+    for (var n in node.statements.nodes) {
       n.accept(this);
-      if (blockReturns) return null;
+      if (!isOpen) return null;
     }
     return null;
   }
 
-  ir.Node visitReturn(ast.Return node) {
-    assert(!blockReturns);
-    ir.Expression value;
+  // 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) {
+    assert(isOpen);
     // TODO(lry): support native returns.
-    if (node.beginToken.value == 'native') giveup();
+    if (node.beginToken.value == 'native') return giveup();
+    ir.Trivial value;
     if (node.expression == null) {
-      value = builder.addConstant(constantSystem.createNull(), node);
+      value = new ir.Constant(constantSystem.createNull());
+      add(new ir.LetVal(value));
     } else {
       value = node.expression.accept(this);
+      if (!isOpen) return null;
     }
-    builder.addStatement(new ir.Return(nodePosition(node), value));
-    builder.block.hasReturn = true;
+    add(new ir.InvokeContinuation(returnContinuation, value));
+    current = null;
     return null;
   }
-
-  ir.Constant visitLiteralBool(ast.LiteralBool node) {
-    return builder.addConstant(constantSystem.createBool(node.value), node);
+  
+  // For all simple literals:
+  // Build(Literal(c)) = (let val x = Constant(c) in [], x)
+  ir.Trivial visitLiteralBool(ast.LiteralBool node) {
+    assert(isOpen);
+    ir.Constant constant =
+        new ir.Constant(constantSystem.createBool(node.value));
+    add(new ir.LetVal(constant));
+    return constant;
   }
 
-  ir.Constant visitLiteralDouble(ast.LiteralDouble node) {
-    return builder.addConstant(constantSystem.createDouble(node.value), node);
+  ir.Trivial visitLiteralDouble(ast.LiteralDouble node) {
+    assert(isOpen);
+    ir.Constant constant =
+        new ir.Constant(constantSystem.createDouble(node.value));
+    add(new ir.LetVal(constant));
+    return constant;
   }
 
-  ir.Constant visitLiteralInt(ast.LiteralInt node) {
-    return builder.addConstant(constantSystem.createInt(node.value), node);
+  ir.Trivial visitLiteralInt(ast.LiteralInt node) {
+    assert(isOpen);
+    ir.Constant constant =
+        new ir.Constant(constantSystem.createInt(node.value));
+    add(new ir.LetVal(constant));
+    return constant;
   }
 
-  ir.Constant visitLiteralString(ast.LiteralString node) {
-    Constant value = constantSystem.createString(node.dartString);
-    return builder.addConstant(value, node);
+  ir.Trivial visitLiteralString(ast.LiteralString node) {
+    assert(isOpen);
+    ir.Constant constant =
+        new ir.Constant(constantSystem.createString(node.dartString));
+    add(new ir.LetVal(constant));
+    return constant;
   }
 
-  ir.Constant visitLiteralNull(ast.LiteralNull node) {
-    return builder.addConstant(constantSystem.createNull(), node);
+  ir.Trivial visitLiteralNull(ast.LiteralNull node) {
+    assert(isOpen);
+    ir.Constant constant = new ir.Constant(constantSystem.createNull());
+    add(new ir.LetVal(constant));
+    return constant;
   }
 
 //  TODO(lry): other literals.
@@ -302,78 +353,81 @@
 //  IrNode visitLiteralMapEntry(LiteralMapEntry node) => visitNode(node);
 //  IrNode visitLiteralSymbol(LiteralSymbol node) => visitExpression(node);
 
-  ir.Node visitAssert(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitAssert(ast.Send node) {
+    return giveup();
   }
 
-  ir.Node visitClosureSend(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitClosureSend(ast.Send node) {
+    return giveup();
   }
 
-  ir.Node visitDynamicSend(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitDynamicSend(ast.Send node) {
+    return giveup();
   }
 
-  ir.Node visitGetterSend(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitGetterSend(ast.Send node) {
+    return giveup();
   }
 
-  ir.Node visitOperatorSend(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitOperatorSend(ast.Send node) {
+    return giveup();
   }
 
-  ir.Node visitStaticSend(ast.Send node) {
-    Selector selector = elements.getSelector(node);
+  // Build(StaticSend(f, a...)) = C[InvokeStatic(f, x...)]
+  //   where (C, x...) = BuildList(a...)
+  ir.Trivial visitStaticSend(ast.Send node) {
+    assert(isOpen);
     Element element = elements[node];
-
     // TODO(lry): support static fields. (separate IR instruction?)
-    if (element.isField() || element.isGetter()) giveup();
+    if (element.isField() || element.isGetter()) return giveup();
     // TODO(lry): support constructors / factory calls.
-    if (element.isConstructor()) giveup();
+    if (element.isConstructor()) return giveup();
     // TODO(lry): support foreign functions.
-    if (element.isForeign(compiler)) giveup();
+    if (element.isForeign(compiler)) return giveup();
     // TODO(lry): for elements that could not be resolved emit code to throw a
     // [NoSuchMethodError].
-    if (element.isErroneous()) giveup();
-    // TODO(lry): support named arguments
-    if (selector.namedArgumentCount != 0) giveup();
+    if (element.isErroneous()) return giveup();
+    // TODO(lry): generate IR for object identicality.
+    if (element == compiler.identicalFunction) giveup();
 
-    List<ir.Expression> arguments = <ir.Expression>[];
+    Selector selector = elements.getSelector(node);
+    // TODO(lry): support named arguments
+    if (selector.namedArgumentCount != 0) return giveup();
+
+    List arguments = [];
     // TODO(lry): support default arguments, need support for locals.
     bool succeeded = selector.addArgumentsToList(
         node.arguments, arguments, element.implementation,
-        (node) => node.accept(this), (node) => giveup(), compiler);
+        // Guard against visiting arguments after an argument expression throws.
+        (node) => isOpen ? node.accept(this) : null,
+        (node) => giveup(),
+        compiler);
     if (!succeeded) {
       // TODO(lry): generate code to throw a [WrongArgumentCountError].
-      giveup();
+      return giveup();
     }
-    // TODO(lry): generate IR for object identicality.
-    if (element == compiler.identicalFunction) giveup();
-    ir.InvokeStatic result = builder.addStatement(
-        new ir.InvokeStatic(nodePosition(node), element, selector, arguments));
-    return result;
+    if (!isOpen) return null;
+    ir.Parameter v = new ir.Parameter();
+    ir.Continuation k = new ir.Continuation(v);
+    ir.Expression invoke =
+        new ir.InvokeStatic(element, selector, k, arguments);
+    add(new ir.LetCont(k, invoke));
+    return v;
   }
 
-  ir.Node visitSuperSend(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitSuperSend(ast.Send node) {
+    return giveup();
   }
 
-  ir.Node visitTypeReferenceSend(ast.Send node) {
-    giveup();
-    return null;
+  ir.Trivial visitTypeReferenceSend(ast.Send node) {
+    return giveup();
   }
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Node giveup() => throw ABORT_IRNODE_BUILDER;
+  ir.Trivial giveup() => throw ABORT_IRNODE_BUILDER;
 
-  ir.Node nullIfGiveup(ir.Node action()) {
+  ir.Function nullIfGiveup(ir.Function action()) {
     try {
       return action();
     } catch(e) {
@@ -386,37 +440,3 @@
     giveup();
   }
 }
-
-class IrBuilder {
-  final IrNodeBuilderVisitor visitor;
-  IrBuilder(this.visitor);
-
-  List<BlockBuilder> blockBuilders = <BlockBuilder>[];
-
-  BlockBuilder get block => blockBuilders.last;
-
-  Map<Constant, ir.Constant> constants = <Constant, ir.Constant>{};
-
-  ir.Constant addConstant(Constant value, ast.Node node) {
-    return constants.putIfAbsent(
-      value, () => new ir.Constant(visitor.nodePosition(node), value));
-  }
-
-  ir.Node addStatement(ir.Node statement) {
-    block.statements.add(statement);
-    return statement;
-  }
-
-  void enterBlock() {
-    blockBuilders.add(new BlockBuilder());
-  }
-
-  void exitBlock() {
-    blockBuilders.removeLast();
-  }
-}
-
-class BlockBuilder {
-  List<ir.Node> statements = <ir.Node>[];
-  bool hasReturn = false;
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index 5282c6b..d130377 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -12,72 +12,78 @@
 import '../universe/universe.dart' show Selector, SelectorKind;
 import '../util/util.dart' show Spannable;
 
-/**
- * A pair of source offset and an identifier name. Identifier names are used in
- * the Javascript backend to generate source maps.
- */
-class PositionWithIdentifierName {
-  final int offset;
-  final String sourceName;
-  PositionWithIdentifierName(this.offset, this.sourceName);
-}
-
-abstract class Node implements Spannable {
+abstract class Node {
   static int hashCount = 0;
   final int hashCode = hashCount = (hashCount + 1) & 0x3fffffff;
 
-  final /* int | PositionWithIdentifierName */ position;
-
-  const Node(this.position);
-
-  int get offset => (position is int) ? position : position.offset;
-
-  String get sourceName => (position is int) ? null : position.sourceName;
-
-  List<int> pickle(IrConstantPool constantPool) {
-    return new Pickler(constantPool).pickle(this);
-  }
-
-  accept(NodesVisitor visitor);
+  accept(Visitor visitor);
 }
 
 abstract class Expression extends Node {
-  Expression(position) : super(position);
+  Expression plug(Expression expr) => throw 'impossible';
 }
 
-class Function extends Expression {
-  final List<Node> statements;
-
-  final int endOffset;
-  final int namePosition;
-
-  Function(position, this.endOffset, this.namePosition, this.statements)
-    : super(position);
-
-  accept(NodesVisitor visitor) => visitor.visitFunction(this);
+// 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 head of a linked-list of occurrences, in no particular order.
+  Variable firstUse = null;
 }
 
-class Return extends Node {
-  final Expression value;
-
-  Return(position, this.value) : super(position);
-
-  accept(NodesVisitor visitor) => visitor.visitReturn(this);
+// 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;
+  Variable nextUse = null;
+  
+  Variable(this.definition) {
+    nextUse = definition.firstUse;
+    definition.firstUse = this;
+  }
 }
 
-class Constant extends Expression {
-  final dart2js.Constant value;
-
-  Constant(position, this.value) : super(position);
-
-  accept(NodesVisitor visitor) => visitor.visitConstant(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 []'.
+class LetVal extends Expression {
+  final Trivial 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'.
+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.
 class InvokeStatic extends Expression {
   final FunctionElement target;
 
-  final List<Expression> arguments;
-
   /**
    * The selector encodes how the function is invoked: number of positional
    * arguments, names used in named arguments. This information is required
@@ -85,37 +91,94 @@
    */
   final Selector selector;
 
-  InvokeStatic(position, this.target, this.selector, this.arguments)
-    : super(position) {
+  final Variable continuation;
+  final List<Variable> arguments;
+  
+  InvokeStatic(this.target, this.selector, Continuation cont,
+               List<Trivial> args)
+      : continuation = new Variable(cont),
+        arguments = args.map((t) => new Variable(t)).toList(growable: false) {
     assert(selector.kind == SelectorKind.CALL);
     assert(selector.name == target.name);
   }
 
-  accept(NodesVisitor visitor) => visitor.visitInvokeStatic(this);
+  accept(Visitor visitor) => visitor.visitInvokeStatic(this);
 }
 
-/**
- * This class is only used during SSA generation, its instances never appear in
- * the representation of a function.
- */
-class InlinedInvocationDummy extends Expression {
-  InlinedInvocationDummy() : super(0);
-  accept(NodesVisitor visitor) => throw "IrInlinedInvocationDummy.accept";
+// Invoke a continuation in tail position.
+class InvokeContinuation extends Expression {
+  final Variable continuation;
+  final Variable argument;
+  
+  InvokeContinuation(Continuation cont, Trivial 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 {
+  final dart2js.Constant value;
+  
+  Constant(this.value);
+  
+  accept(Visitor visitor) => visitor.visitConstant(this);
+}
 
-abstract class NodesVisitor<T> {
-  T visit(Node node) => node.accept(this);
+// Function and continuation parameters are trivial.
+class Parameter extends Trivial {
+  Parameter();
+  
+  accept(Visitor visitor) => visitor.visitParameter(this);
+}
 
-  void visitAll(List<Node> nodes) {
-    for (Node n in nodes) visit(n);
+// 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 {
+  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 {
+  final int endOffset;
+  final int namePosition;
+  
+  final Continuation returnContinuation;
+  final Expression body;
+
+  Function(this.endOffset, this.namePosition, this.returnContinuation,
+           this.body);
+
+  List<int> pickle(IrConstantPool constantPool) {
+    return new Pickler(constantPool).pickle(this);
   }
 
-  T visitNode(Node node);
+  accept(Visitor visitor) => visitor.visitFunction(this);
+}
 
+abstract class Visitor<T> {
+  T visitNode(Node node) => node.accept(this);
+  
+  T visitFunction(Function node) => visitNode(node);
   T visitExpression(Expression node) => visitNode(node);
-  T visitFunction(Function node) => visitExpression(node);
-  T visitReturn(Return node) => visitNode(node);
-  T visitConstant(Constant node) => visitExpression(node);
-  T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
+  T visitTrivial(Trivial 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);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
index 327cad3..68a5b88 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_pickler.dart
@@ -26,24 +26,23 @@
 /* The int(entries) counts expression nodes, which might potentially be
  * referred to in a back reference.
  *
- * pickle     ::= int(entries) node(function)
+ * pickle   ::= int(entries) function
  *
- * int        ::= see [writeInt] for number encoding
+ * function ::= int(endSourceOffset) int(namePosition) node(body)
  *
- * string     ::= byte(STRING_ASCII) int(length) {byte(ascii)}
- *              | byte(STRING_UTF8) int(length) {byte(utf8)}
+ * int      ::= see [writeInt] for number encoding
  *
- * node       ::= byte(NODE_FUNCTION) position int(endSourceOffset)
- *                    int(namePosition) int(statements) {node(statement)}
- *              | byte(NODE_RETURN) position reference(value)
- *              | byte(NODE_CONST) position constant
- *              | byte(NODE_INVOKE_STATIC) position element selector
- *                    int(arguments) {reference(argument)}
+ * string   ::= byte(STRING_ASCII) int(length) {byte(ascii)}
+ *            | byte(STRING_UTF8) int(length) {byte(utf8)}
  *
- * reference  ::= int(indexDelta)
+ * node      ::= byte(NODE_CONSTANT) constant node(next)
+ *             | byte(NODE_LET_CONT) node(next) node(body)
+ *             | byte(NODE_INVOKE_STATIC) element selector
+ *                   reference(continuation) {reference(argument)}
+ *             | byte(NODE_INVOKE_CONTINUATION) reference(continuation)
+ *                   reference(argument)
  *
- * position   ::= byte(POSITION_WITH_ID) string(sourceName) int(sourceOffset)
- *              | byte(POSITION_OFFSET) int(sourceOffset)
+ * reference ::= int(indexDelta)
  *
  * constant   ::= byte(CONST_BOOL) byte(0 or 1)
  *              | byte(CONST_DOUBLE) byte{8}
@@ -67,23 +66,15 @@
   static const int STRING_ASCII = BACKREFERENCE + 1;
   static const int STRING_UTF8  = STRING_ASCII + 1;
 
-  static const int BEGIN_STATEMENT_NODE = STRING_UTF8 + 1;
-  static const int NODE_RETURN          = BEGIN_STATEMENT_NODE;
-  static const int END_STATEMENT_NODE   = NODE_RETURN;
+  static const int FIRST_NODE_TAG           = STRING_UTF8 + 1;
+  static const int NODE_CONSTANT            = FIRST_NODE_TAG;
+  static const int NODE_LET_CONT            = NODE_CONSTANT + 1;
+  static const int NODE_INVOKE_STATIC       = NODE_LET_CONT + 1;
+  static const int NODE_INVOKE_CONTINUATION = NODE_INVOKE_STATIC + 1;
+  static const int LAST_NODE_TAG            = NODE_INVOKE_CONTINUATION;
 
-  static const int BEGIN_EXPRESSION_NODE = END_STATEMENT_NODE + 1;
-  static const int NODE_FUNCTION         = BEGIN_EXPRESSION_NODE;
-  static const int NODE_CONST            = NODE_FUNCTION + 1;
-  static const int NODE_INVOKE_STATIC    = NODE_CONST + 1;
-  static const int END_EXPRESSION_NODE   = NODE_INVOKE_STATIC;
-
-  static const int BEGIN_POSITION   = END_EXPRESSION_NODE + 1;
-  static const int POSITION_OFFSET  = BEGIN_POSITION;
-  static const int POSITION_WITH_ID = POSITION_OFFSET + 1;
-  static const int END_POSITION     = POSITION_WITH_ID;
-
-  static const int BEGIN_CONST          = END_POSITION + 1;
-  static const int CONST_BOOL           = BEGIN_CONST;
+  static const int FIRST_CONST_TAG      = LAST_NODE_TAG + 1;
+  static const int CONST_BOOL           = FIRST_CONST_TAG;
   static const int CONST_INT            = CONST_BOOL + 1;
   static const int CONST_DOUBLE         = CONST_INT + 1;
   static const int CONST_STRING_LITERAL = CONST_DOUBLE + 1;
@@ -91,17 +82,13 @@
   static const int CONST_STRING_ESCAPED = CONST_STRING_RAW + 1;
   static const int CONST_STRING_CONS    = CONST_STRING_ESCAPED + 1;
   static const int CONST_NULL           = CONST_STRING_CONS + 1;
-  static const int END_CONST            = CONST_NULL;
+  static const int LAST_CONST_TAG       = CONST_NULL;
 
-  static const int BEGIN_SELECTOR   = END_CONST + 1;
-  static const int SELECTOR_UNTYPED = BEGIN_SELECTOR;
-  static const int END_SELECTOR     = SELECTOR_UNTYPED + 1;
+  static const int FIRST_SELECTOR_TAG = LAST_CONST_TAG + 1;
+  static const int SELECTOR_UNTYPED   = FIRST_SELECTOR_TAG;
+  static const int LAST_SELECTOR_TAG  = SELECTOR_UNTYPED;
 
-  static const int END_TAG = END_SELECTOR;
-
-  static bool isExpressionTag(int tag) {
-    return BEGIN_EXPRESSION_NODE <= tag && tag <= END_EXPRESSION_NODE;
-  }
+  static const int LAST_TAG = LAST_SELECTOR_TAG;
 
   static final List<SelectorKind> selectorKindFromId = _selectorKindFromId();
 
@@ -117,7 +104,6 @@
     }
     return result;
   }
-
 }
 
 class IrConstantPool {
@@ -152,13 +138,13 @@
 /**
  * The [Pickler] serializes [ir.Node]s to a byte array.
  */
-class Pickler extends ir.NodesVisitor {
+class Pickler extends ir.Visitor {
   ConstantPickler constantPickler;
 
   IrConstantPool constantPool;
 
   Pickler(this.constantPool) {
-    assert(Pickles.END_TAG <= 0xff);
+    assert(Pickles.LAST_TAG <= 0xff);
     constantPickler = new ConstantPickler(this);
   }
 
@@ -182,12 +168,12 @@
    */
   ByteData doubleData = new ByteData(8);
 
-  List<int> pickle(ir.Node node) {
+  List<int> pickle(ir.Function function) {
     data = new Uint8List(INITIAL_SIZE);
     offset = 0;
     emitted = <Object, int>{};
     index = 0;
-    node.accept(this);
+    function.accept(this);
 
     int sizeOffset = offset;
     writeInt(emitted.length);
@@ -303,18 +289,6 @@
     }
   }
 
-  void writePosition(/* int | PositionWithIdentifierName */ position) {
-    if (position is int) {
-      writeByte(Pickles.POSITION_OFFSET);
-      writeInt(position);
-    } else {
-      ir.PositionWithIdentifierName namedPosition = position;
-      writeByte(Pickles.POSITION_WITH_ID);
-      writeString(namedPosition.sourceName);
-      writeInt(namedPosition.offset);
-    }
-  }
-
   void writeConstBool(bool b) {
     writeByte(Pickles.CONST_BOOL);
     writeByte(b ? 1 : 0);
@@ -382,44 +356,56 @@
     }
   }
 
-  void writeNodeList(List<ir.Node> nodes) {
-    writeInt(nodes.length);
-    for (int i = 0; i < nodes.length; i++) {
-      nodes[i].accept(this);
-    }
-  }
-
   void visitFunction(ir.Function node) {
-    recordForBackReference(node);
-    writeByte(Pickles.NODE_FUNCTION);
-    writePosition(node.position);
     writeInt(node.endOffset);
     writeInt(node.namePosition);
-    writeNodeList(node.statements);
+    // The continuation parameter is bound in the body.
+    recordForBackReference(node.returnContinuation);
+    node.body.accept(this);
   }
 
-  void visitReturn(ir.Return node) {
-    writeByte(Pickles.NODE_RETURN);
-    writePosition(node.position);
-    writeBackReference(node.value);
+  void visitLetVal(ir.LetVal node) {
+    node.value.accept(this);
+    // The right-hand side is bound in the body.
+    recordForBackReference(node.value);
+    node.body.accept(this);
   }
 
-  void visitConstant(ir.Constant node) {
-    recordForBackReference(node);
-    writeByte(Pickles.NODE_CONST);
-    writePosition(node.position);
-    node.value.accept(constantPickler);
+  void visitLetCont(ir.LetCont node) {
+    // There are two choices of which expression tree to write first---the
+    // continuation body or the LetCont body.  The unpickler will unpickle the
+    // the first recursively and the second iteratively.  Since the hole in
+    // LetCont contexts is in the continuation body, the continuation should be
+    // written second.
+    writeByte(Pickles.NODE_LET_CONT);
+    // The continuation is bound in the body.
+    recordForBackReference(node.continuation);
+    node.body.accept(this);
+    // The continuation parameter is bound in the continuation's body.
+    recordForBackReference(node.continuation.parameter);
+    node.continuation.body.accept(this);
   }
 
   void visitInvokeStatic(ir.InvokeStatic node) {
-    recordForBackReference(node);
     writeByte(Pickles.NODE_INVOKE_STATIC);
-    writePosition(node.position);
     writeElement(node.target);
     writeSelector(node.selector);
     // TODO(lry): compact encoding when the arity of the selector and the
     // arguments list are the same
-    writeBackReferenceList(node.arguments);
+    writeBackReference(node.continuation.definition);
+    writeBackReferenceList(node.arguments.map(
+        (a) => a.definition).toList(growable: false));
+  }
+
+  void visitInvokeContinuation(ir.InvokeContinuation node) {
+    writeByte(Pickles.NODE_INVOKE_CONTINUATION);
+    writeBackReference(node.continuation.definition);
+    writeBackReference(node.argument.definition);
+  }
+
+  void visitConstant(ir.Constant node) {
+    writeByte(Pickles.NODE_CONSTANT);
+    node.value.accept(constantPickler);
   }
 
   void visitNode(ir.Node node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index e55aa54..3ca270d 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -35,7 +35,7 @@
     int numEntries = readInt();
     unpickled = new List<Object>(numEntries);
     index = 0;
-    return readNode();
+    return readFunctionNode();
   }
 
   int readByte() {
@@ -99,35 +99,48 @@
     return result;
   }
 
-  /**
-   * Reads a [ir.Node]. Expression nodes are added to the [unpickled] map to
-   * enable unpickling back references.
-   */
-  ir.Node readNode() {
+  static ir.Expression addExpression(ir.Expression context,
+                                     ir.Expression expr) {
+    return (context == null) ? expr : context.plug(expr);
+  }
+
+  // Read a single expression and plug it into an outer context.  If the read
+  // expression is not in tail position, return it.  Otherwise, return null.
+  ir.Expression readExpressionNode(ir.Expression context) {
     int tag = readByte();
-    if (Pickles.isExpressionTag(tag)) {
-      return readExpressionNode(tag);
-    } else if (tag == Pickles.NODE_RETURN) {
-      return readReturnNode();
-    } else {
-      compiler.internalError("Unexpected entry tag: $tag");
-      return null;
+    switch (tag) {
+      case Pickles.NODE_CONSTANT:
+        ir.Trivial constant = readConstantNode();
+        unpickled[index++] = constant;
+        return addExpression(context, new ir.LetVal(constant));
+      case Pickles.NODE_LET_CONT:
+        ir.Parameter parameter = new ir.Parameter();
+        ir.Continuation continuation = new ir.Continuation(parameter);
+        unpickled[index++] = continuation;
+        ir.Expression body = readDelimitedExpressionNode();
+        unpickled[index++] = parameter;
+        return addExpression(context, new ir.LetCont(continuation, body));
+      case Pickles.NODE_INVOKE_STATIC:
+        addExpression(context, readInvokeStaticNode());
+        return null;
+      case Pickles.NODE_INVOKE_CONTINUATION:
+        addExpression(context, readInvokeContinuationNode());
+        return null;
+      default:
+        compiler.internalError("Unexpected expression entry tag: $tag");
+        return null;
     }
   }
 
-  ir.Expression readExpressionNode(int tag) {
-    int entryIndex = index++;
-    ir.Expression result;
-    if (tag == Pickles.NODE_CONST) {
-      result = readConstantNode();
-    } else if (tag == Pickles.NODE_FUNCTION) {
-      result = readFunctionNode();
-    } else if (tag == Pickles.NODE_INVOKE_STATIC) {
-      result = readInvokeStaticNode();
-    } else {
-      compiler.internalError("Unexpected expression entry tag: $tag");
+  // Iteratively read expressions until an expression in a tail position
+  // (e.g., an invocation) is found.
+  ir.Expression readDelimitedExpressionNode() {
+    ir.Expression root = readExpressionNode(null);
+    ir.Expression context = root;
+    while (context != null) {
+      context = readExpressionNode(context);
     }
-    return unpickled[entryIndex] = result;
+    return root;
   }
 
   Object readBackReference() {
@@ -137,60 +150,45 @@
     return unpickled[entryIndex];
   }
 
-  List<ir.Expression> readExpressionBackReferenceList() {
+  List<ir.Trivial> readBackReferenceList() {
     int length = readInt();
-    List<ir.Expression> result = new List<ir.Expression>(length);
+    List<ir.Trivial> result = new List<ir.Trivial>(length);
     for (int i = 0; i < length; i++) {
       result[i] = readBackReference();
     }
     return result;
   }
 
-  List<ir.Node> readNodeList() {
-    int length = readInt();
-    List<ir.Node> nodes = new List<ir.Node>(length);
-    for (int i = 0; i < length; i++) {
-      nodes[i] = readNode();
-    }
-    return nodes;
-  }
-
   ir.Function readFunctionNode() {
-    var position = readPosition();
     int endOffset = readInt();
     int namePosition = readInt();
-    List<ir.Node> statements = readNodeList();
-    return new ir.Function(position, endOffset, namePosition, statements);
+    // There is implicitly a return continuation which can be the target of
+    // back references.
+    ir.Continuation continuation = new ir.Continuation.retrn();
+    unpickled[index++] = continuation;
+
+    ir.Expression body = readDelimitedExpressionNode();
+    return new ir.Function(endOffset, namePosition, continuation, body);
   }
 
   ir.Constant readConstantNode() {
-    var position = readPosition();
     Constant constant = readConstant();
-    return new ir.Constant(position, constant);
-  }
-
-  ir.Return readReturnNode() {
-    var position = readPosition();
-    ir.Expression value = readBackReference();
-    return new ir.Return(position, value);
+    return new ir.Constant(constant);
   }
 
   ir.InvokeStatic readInvokeStaticNode() {
-    var position = readPosition();
     FunctionElement functionElement = readElement();
     Selector selector = readSelector();
-    List<ir.Expression> arguments = readExpressionBackReferenceList();
-    return new ir.InvokeStatic(position, functionElement, selector, arguments);
+    ir.Continuation continuation = readBackReference();
+    List<ir.Trivial> arguments = readBackReferenceList();
+    return new ir.InvokeStatic(functionElement, selector, continuation,
+                               arguments);
   }
 
-  /* int | PositionWithIdentifierName */ readPosition() {
-    if (readByte() == Pickles.POSITION_OFFSET) {
-      return readInt();
-    } else {
-      String sourceName = readString();
-      int offset = readInt();
-      return new ir.PositionWithIdentifierName(offset, sourceName);
-    }
+  ir.InvokeContinuation readInvokeContinuationNode() {
+    ir.Continuation continuation = readBackReference();
+    ir.Trivial argument = readBackReference();
+    return new ir.InvokeContinuation(continuation, argument);
   }
 
   Constant readConstant() {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 6d22105..4f14f50 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -2657,8 +2657,6 @@
                                 Compiler compiler) {
   // Returns the single identity comparison (== or ===) or null if a more
   // complex expression is required.
-  if ((left.isConstant() && left.isConstantSentinel()) ||
-      (right.isConstant() && right.isConstantSentinel())) return '===';
   if (left.canBeNull() && right.canBeNull()) {
     if (left.isConstantNull() || right.isConstantNull() ||
         (left.isPrimitive(compiler) &&
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index accb1f7a..774ab84 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1175,7 +1175,6 @@
   bool isConstantMap() => false;
   bool isConstantFalse() => false;
   bool isConstantTrue() => false;
-  bool isConstantSentinel() => false;
 
   bool isInterceptor(Compiler compiler) => false;
 
@@ -1930,7 +1929,6 @@
   bool isConstantMap() => constant.isMap();
   bool isConstantFalse() => constant.isFalse();
   bool isConstantTrue() => constant.isTrue();
-  bool isConstantSentinel() => constant.isSentinel();
 
   bool isInterceptor(Compiler compiler) => constant.isInterceptor();
 
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index ffea511..8a19dc68 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -269,6 +269,7 @@
   final RawReceivePortImpl controlPort = new RawReceivePortImpl._controlPort();
 
   final Capability pauseCapability = new Capability();
+  final Capability terminateCapability = new Capability();  // License to kill.
 
   // TODO(lrn): Store these in single "PauseState" object, so they don't take
   // up as much room when not pausing.
@@ -279,6 +280,12 @@
   // Container with the "on exit" handler send-ports.
   var doneHandlers;
 
+  /** Whether errors are considered fatal. */
+  // This doesn't do anything yet. We need to be able to catch uncaught errors
+  // (oxymoronically) in order to take lethal action. This is waiting for the
+  // same change as the uncaught error listeners.
+  bool errorsAreFatal = false;
+
   _IsolateContext() {
     this.registerWeak(controlPort._id, controlPort);
   }
@@ -319,6 +326,23 @@
     doneHandlers.remove(responsePort);
   }
 
+  void setErrorsFatal(Capability authentification, bool errorsAreFatal) {
+    if (terminateCapability != authentification) return;
+    this.errorsAreFatal = errorsAreFatal;
+  }
+
+  void handlePing(SendPort responsePort, int pingType) {
+    if (pingType == Isolate.PING_EVENT) {
+      _globalState.topEventLoop.enqueue(this, () {
+        responsePort.send(null);
+      }, "ping");
+    } else {
+      // There is no difference between PING_ALIVE and PING_CONTROL
+      // since we don't handle it before the control event queue.
+      responsePort.send(null);
+    }
+  }
+
   /**
    * Run [code] in the context of the isolate represented by [this].
    */
@@ -354,6 +378,12 @@
       case 'remove-ondone':
         removeDoneListener(message[1]);
         break;
+      case 'set-errors-fatal':
+        setErrorsFatal(message[1], message[2]);
+        break;
+      case "ping":
+        handlePing(message[1], message[2]);
+        break;
       default:
         print("UNKNOWN MESSAGE: $message");
     }
@@ -822,7 +852,8 @@
     // The isolate's port does not keep the isolate open.
     replyTo.send([_SPAWNED_SIGNAL,
                   context.controlPort.sendPort,
-                  context.pauseCapability]);
+                  context.pauseCapability,
+                  context.terminateCapability]);
 
     void runStartFunction() {
       if (!isSpawnUri) {
diff --git a/sdk/lib/_internal/lib/isolate_patch.dart b/sdk/lib/_internal/lib/isolate_patch.dart
index 3858c15..4959a0d 100644
--- a/sdk/lib/_internal/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/lib/isolate_patch.dart
@@ -16,7 +16,9 @@
                                      { bool paused: false }) {
     try {
       return IsolateNatives.spawnFunction(entryPoint, message, paused)
-          .then((msg) => new Isolate._fromControlPort(msg[1], msg[2]));
+          .then((msg) => new Isolate(msg[1],
+                                     pauseCapability: msg[2],
+                                     terminateCapability: msg[3]));
     } catch (e, st) {
       return new Future<Isolate>.error(e, st);
     }
@@ -35,7 +37,9 @@
         throw new ArgumentError("Args must be a list of Strings $args");
       }
       return IsolateNatives.spawnUri(uri, args, message, paused)
-          .then((msg) => new Isolate._fromControlPort(msg[1], msg[2]));
+          .then((msg) => new Isolate(msg[1],
+                                     pauseCapability: msg[2],
+                                     terminateCapability: msg[3]));
     } catch (e, st) {
       return new Future<Isolate>.error(e, st);
     }
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index c9134a2..36ecb47 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -2381,9 +2381,11 @@
  * use the compiler's convention to do is-checks on regular objects.
  */
 boolConversionCheck(value) {
+  if (value is bool) return value;
+  // One of the following checks will always fail.
   boolTypeCheck(value);
   assert(value != null);
-  return value;
+  return false;
 }
 
 stringTypeCheck(value) {
@@ -2674,13 +2676,16 @@
  * Helper function for implementing asserts. The compiler treats this specially.
  */
 void assertHelper(condition) {
-  if (condition is Function) condition = condition();
+  // Do a bool check first because it is common and faster than 'is Function'.
   if (condition is !bool) {
-    throw new TypeErrorImplementation(condition, 'bool');
+    if (condition is Function) condition = condition();
+    if (condition is !bool) {
+      throw new TypeErrorImplementation(condition, 'bool');
+    }
   }
   // Compare to true to avoid boolean conversion check in checked
   // mode.
-  if (!identical(condition, true)) throw new AssertionError();
+  if (true != condition) throw new AssertionError();
 }
 
 /**
diff --git a/sdk/lib/_internal/lib/preambles/d8.js b/sdk/lib/_internal/lib/preambles/d8.js
new file mode 100644
index 0000000..2b20e49
--- /dev/null
+++ b/sdk/lib/_internal/lib/preambles/d8.js
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Javascript preamble, that lets the output of dart2js run on V8's d8 shell.
diff --git a/sdk/lib/_internal/lib/preambles/jsshell.js b/sdk/lib/_internal/lib/preambles/jsshell.js
new file mode 100644
index 0000000..f24555f
--- /dev/null
+++ b/sdk/lib/_internal/lib/preambles/jsshell.js
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Javascript preamble, that lets the output of dart2js run on JSShell.
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 012e07c..55f9f1d 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
@@ -5,6 +5,7 @@
 library pub.barback.build_environment;
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
@@ -16,7 +17,6 @@
 import '../log.dart' as log;
 import '../package.dart';
 import '../package_graph.dart';
-import '../utils.dart';
 import 'dart_forwarding_transformer.dart';
 import 'dart2js_transformer.dart';
 import 'load_all_transformers.dart';
@@ -55,12 +55,14 @@
       Iterable<String> rootDirectories,
       {bool useDart2JS: true}) {
     return entrypoint.loadPackageGraph().then((graph) {
+      log.fine("Loaded package graph.");
       var barback = new Barback(new PubPackageProvider(graph));
       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.
         //
@@ -168,6 +170,7 @@
   /// loaded.
   Future _load(Barback barback) {
     return _provideSources(barback).then((_) {
+      log.fine("Provided sources.");
       var completer = new Completer();
 
       // If any errors get emitted either by barback or by the primary server,
@@ -194,6 +197,7 @@
       ];
 
       loadAllTransformers(this).then((_) {
+        log.fine("Loaded transformers.");
         if (!completer.isCompleted) completer.complete();
       }).catchError((error, stackTrace) {
         if (!completer.isCompleted) {
@@ -217,16 +221,13 @@
       return _watchSources(barback);
     }
 
-    return syncFuture(() {
-      _loadSources(barback);
-    });
+    return _loadSources(barback);
   }
 
   /// Provides all of the source assets in the environment to barback.
-  void _loadSources(Barback barback) {
-    for (var package in graph.packages.values) {
-      barback.updateSources(_listAssets(graph.entrypoint, package));
-    }
+  Future _loadSources(Barback barback) {
+    return Future.wait(graph.packages.values.map(
+        (package) => _updateSources(graph.entrypoint, package)));
   }
 
   /// Adds all of the source assets in this environment to barback and then
@@ -242,8 +243,7 @@
       var packageId = graph.lockFile.packages[package.name];
       if (packageId != null &&
           graph.entrypoint.cache.sources[packageId.source].shouldCache) {
-        barback.updateSources(_listAssets(graph.entrypoint, package));
-        return new Future.value();
+        return _updateSources(graph.entrypoint, package);
       }
 
       // Watch the visible package directories for changes.
@@ -282,29 +282,39 @@
           }
         });
         return watcher.ready;
-      })).then((_) {
-        barback.updateSources(_listAssets(graph.entrypoint, package));
-      });
+      })).then((_) => _updateSources(graph.entrypoint, package));
     }));
   }
 
-  /// Lists all of the visible files in [package].
+  /// Lists all of the visible files in [package] and updates them in barback.
   ///
   /// This is the recursive contents of the "asset" and "lib" directories (if
   /// present). If [package] is the entrypoint package, it also includes the
-  /// contents of "web".
-  List<AssetId> _listAssets(Entrypoint entrypoint, Package package) {
-    var files = <AssetId>[];
-
-    for (var dirPath in _getPublicDirectories(entrypoint, package)) {
+  /// build directories.
+  ///
+  /// 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(Entrypoint entrypoint, Package package) {
+    return Future.wait(_getPublicDirectories(entrypoint, package)
+        .map((dirPath) {
       var dir = path.join(package.dir, dirPath);
-      if (!dirExists(dir)) continue;
-      for (var entry in listDir(dir, recursive: true)) {
-        // Ignore "packages" symlinks if there.
-        if (path.split(entry).contains("packages")) continue;
+      if (!dirExists(dir)) return new Future.value();
 
-        // Skip directories.
-        if (!fileExists(entry)) continue;
+      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 [];
+
+        var relative = path.normalize(
+            path.relative(entry.path, from: package.dir));
+
+        // 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"
@@ -315,17 +325,13 @@
         // 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 (entry.endsWith(".dart.js")) continue;
-        if (entry.endsWith(".dart.js.map")) continue;
-        if (entry.endsWith(".dart.precompiled.js")) continue;
+        if (relative.endsWith(".dart.js")) return [];
+        if (relative.endsWith(".dart.js.map")) return [];
+        if (relative.endsWith(".dart.precompiled.js")) return [];
 
-        var id = new AssetId(package.name,
-            path.relative(entry, from: package.dir));
-        files.add(id);
-      }
-    }
-
-    return files;
+        return [new AssetId(package.name, relative)];
+      }).toList().then(barback.updateSources);
+    }));
   }
 
   /// Gets the names of the top-level directories in [package] whose contents
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 21585cd..5376635 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
@@ -120,7 +120,14 @@
       var transformers = environment.getBuiltInTransformers(package);
       if (transformers != null) phases.add(transformers);
 
-      environment.barback.updateTransformers(package.name, phases);
+      // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed. If
+      // no transformer in [phases] applies to a source input,
+      // [updateTransformers] may cause a [BuildResult] to be scheduled for
+      // immediate emission. Issue 17305 means that the caller will be unable to
+      // receive this result unless we delay the update to after this function
+      // returns.
+      newFuture(() =>
+          environment.barback.updateTransformers(package.name, phases));
     }
   });
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 53bb5c8..6373935 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -182,12 +182,10 @@
     // top-level build directories.
     if (path.isWithin("assets", destPath) ||
         path.isWithin("packages", destPath)) {
-      builtFiles += buildDirectories.length;
       return Future.wait(buildDirectories.map((buildDir) =>
           _writeOutputFile(asset, path.join(buildDir, destPath))));
     }
 
-    builtFiles++;
     return _writeOutputFile(asset, destPath);
   }
 
@@ -236,6 +234,7 @@
   /// Writes the contents of [asset] to [relativePath] within the build
   /// directory.
   Future _writeOutputFile(Asset asset, String relativePath) {
+    builtFiles++;
     var destPath = path.join(target, relativePath);
     ensureDir(path.dirname(destPath));
     return createFileFromStream(asset.read(), destPath);
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index c5f81c2..e9d4acb 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -10,6 +10,7 @@
 import "dart:convert";
 import 'dart:io';
 import 'dart:isolate';
+@MirrorsUsed(targets: 'pub.io')
 import 'dart:mirrors';
 
 import "package:analyzer/analyzer.dart";
@@ -698,8 +699,11 @@
   });
 }
 
-/// Returns the path to the library named [libraryName]. The library name must
-/// be globally unique, or the wrong library path may be returned.
+/// Returns the path to the library named [libraryName].
+///
+/// The library name must be globally unique, or the wrong library path may be
+/// returned. Any libraries accessed must be added to the [MirrorsUsed]
+/// declaration in the import above.
 String libraryPath(String libraryName) {
   var lib = currentMirrorSystem().findLibrary(new Symbol(libraryName));
   return path.fromUri(lib.uri);
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 72aede4..b7ad177 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -86,6 +86,8 @@
  */
 // TODO(floitsch): document chaining.
 abstract class Future<T> {
+  // The `_nullFuture` is a completed Future with the value `null`.
+  static final _Future _nullFuture = new Future.value(null);
 
   /**
    * Creates a future containing the result of calling [computation]
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index c16bafa..d800825 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -92,31 +92,36 @@
   /**
    * A controller where [stream] can be listened to more than once.
    *
-   * The [Stream] returned by [stream] is a broadcast stream. It can be listened
-   * to more than once.
+   * The [Stream] returned by [stream] is a broadcast stream.
+   * It can be listened to more than once.
    *
    * The controller distributes any events to all currently subscribed
-   * listeners.
-   * It is not allowed to call [add], [addError], or [close] before a previous
-   * call has returned.
+   * listeners at the time when [add], [addError] or [close] is called.
+   * It is not allowed to call `add`, `addError`, or `close` before a previous
+   * call has returned. The controller does not have any internal queue of
+   * events, and if there are no listeners at the time the event is added,
+   * it will just be dropped, or, if it is an error, be reported as uncaught.
    *
-   * If [sync] is true, events may be passed directly to the stream's listener
-   * during an [add], [addError] or [close] call. If [sync] is false, the event
-   * will be passed to the listener at a later time, after the code creating
-   * the event has returned.
+   * Each listener subscription is handled independently,
+   * and if one pauses, only the pausing listener is affected.
+   * A paused listener will buffer events internally until unpaused or canceled.
    *
-   * Each listener is handled independently, and if they pause, only the pausing
-   * listener is affected. A paused listener will buffer events internally until
-   * unpaused or canceled.
+   * If [sync] is true, events may be fired directly by the stream's
+   * subscriptions during an [add], [addError] or [close] call.
+   * If [sync] is false, the event will be fired at a later time,
+   * after the code adding the event has completed.
    *
-   * If [sync] is false, no guarantees are given with regard to when
+   * When [sync] is false, no guarantees are given with regard to when
    * multiple listeners get the events, except that each listener will get
-   * all events in the correct order. If two events are sent on an async
-   * controller with two listeners, one of the listeners may get both events
+   * all events in the correct order. Each subscription handles the events
+   * individually.
+   * If two events are sent on an async controller with two listeners,
+   * one of the listeners may get both events
    * before the other listener gets any.
-   * A listener must be subscribed both when the event is initiated (that is,
-   * when [add] is called) and when the event is later delivered, in order to
-   * get the event.
+   * A listener must be subscribed both when the event is initiated
+   * (that is, when [add] is called)
+   * and when the event is later delivered,
+   * in order to receive the event.
    *
    * The [onListen] callback is called when the first listener is subscribed,
    * and the [onCancel] is called when there are no longer any active listeners.
@@ -381,8 +386,7 @@
 
   Future _ensureDoneFuture() {
     if (_doneFuture == null) {
-      _doneFuture = new _Future();
-      if (_isCanceled) _doneFuture._complete(null);
+      _doneFuture = _isCanceled ? Future._nullFuture : new _Future();
     }
     return _doneFuture;
   }
@@ -416,17 +420,17 @@
    */
   Future close() {
     if (isClosed) {
-      assert(_doneFuture != null);  // Was set when close was first called.
+      _ensureDoneFuture();
       return _doneFuture;
     }
     if (!_mayAddEvent) throw _badEventState();
     _state |= _STATE_CLOSED;
-    _ensureDoneFuture();
     if (hasListener) {
       _sendDone();
     } else if (_isInitialState) {
       _ensurePendingEvents().add(const _DelayedDone());
     }
+    _ensureDoneFuture();
     return _doneFuture;
   }
 
@@ -492,11 +496,13 @@
     _varData = null;
     _state =
         (_state & ~(_STATE_SUBSCRIBED | _STATE_ADDSTREAM)) | _STATE_CANCELED;
+
     void complete() {
       if (_doneFuture != null && _doneFuture._mayComplete) {
         _doneFuture._asyncComplete(null);
       }
     }
+
     Future future = _runGuarded(_onCancel);
     if (future != null) {
       future = future.whenComplete(complete);
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index c7517a4..cd96898c 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -409,8 +409,6 @@
 abstract class _HttpOutboundMessage<T> extends _IOSinkImpl {
   // Used to mark when the body should be written. This is used for HEAD
   // requests and in error handling.
-  bool _ignoreBody = false;
-  bool _headersWritten = false;
   bool _encodingSet = false;
 
   final Uri _uri;
@@ -420,11 +418,11 @@
 
   _HttpOutboundMessage(this._uri,
                        String protocolVersion,
-                       this._outgoing)
-      : super(new _HttpOutboundConsumer(), null),
-        headers = new _HttpHeaders(protocolVersion) {
+                       _HttpOutgoing outgoing)
+      : super(outgoing, null),
+        headers = new _HttpHeaders(protocolVersion),
+        _outgoing = outgoing {
     _outgoing.outbound = this;
-    (_target as _HttpOutboundConsumer).outbound = this;
     _encodingMutable = false;
   }
 
@@ -439,7 +437,7 @@
   }
 
   Encoding get encoding {
-    if (_encodingSet && _headersWritten) {
+    if (_encodingSet && _outgoing.headersWritten) {
       return _encoding;
     }
     var charset;
@@ -464,115 +462,10 @@
     super.write(obj);
   }
 
-  Future _writeHeaders({bool drainRequest: true,
-                        bool setOutgoing: true}) {
-    // TODO(ajohnsen): Avoid excessive futures in this method.
-    write() {
-      try {
-        _writeHeader();
-      } catch (_) {
-        // Headers too large.
-        throw new HttpException(
-            "Headers size exceeded the of '$_OUTGOING_BUFFER_SIZE'"
-            " bytes");
-      }
-      return this;
-    }
-    if (_headersWritten) return new Future.value(this);
-    _headersWritten = true;
-    Future drainFuture;
-    bool isServerSide = this is _HttpResponse;
-    bool gzip = false;
-    if (isServerSide) {
-      var response = this;
-      if (headers.chunkedTransferEncoding) {
-        List acceptEncodings =
-            response._httpRequest.headers[HttpHeaders.ACCEPT_ENCODING];
-        List contentEncoding = headers[HttpHeaders.CONTENT_ENCODING];
-        if (acceptEncodings != null &&
-            acceptEncodings
-                .expand((list) => list.split(","))
-                .any((encoding) => encoding.trim().toLowerCase() == "gzip") &&
-            contentEncoding == null) {
-          headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
-          gzip = true;
-        }
-      }
-      if (drainRequest && !response._httpRequest._incoming.hasSubscriber) {
-        drainFuture = response._httpRequest.drain().catchError((_) {});
-      }
-    } else {
-      drainRequest = false;
-    }
-    if (_ignoreBody) {
-      return new Future.sync(write).then((_) => _outgoing.close());
-    }
-    if (setOutgoing) {
-      int contentLength = headers.contentLength;
-      if (headers.chunkedTransferEncoding) {
-        _outgoing.chunked = true;
-        if (gzip) _outgoing.gzip = true;
-      } else if (contentLength >= 0) {
-        _outgoing.contentLength = contentLength;
-      }
-    }
-    if (drainFuture != null) {
-      return drainFuture.then((_) => write());
-    }
-    return new Future.sync(write);
-  }
-
-  Future _addStream(Stream<List<int>> stream) {
-    // TODO(ajohnsen): Merge into _HttpOutgoing.
-    if (_ignoreBody) {
-      stream.drain().catchError((_) {});
-      return _writeHeaders();
-    }
-    if (_headersWritten) {
-      return _outgoing.addStream(stream);
-    } else {
-      var completer = new Completer.sync();
-      var future = _outgoing.addStream(stream, completer.future);
-      _writeHeaders().then(completer.complete);
-      return future;
-    }
-  }
-
-  Future _close() {
-    // TODO(ajohnsen): Merge into _HttpOutgoing.
-    if (!_headersWritten) {
-      if (!_ignoreBody && headers.contentLength == -1) {
-        // If no body was written, _ignoreBody is false (it's not a HEAD
-        // request) and the content-length is unspecified, set contentLength to
-        // 0.
-        headers.chunkedTransferEncoding = false;
-        headers.contentLength = 0;
-      } else if (!_ignoreBody && headers.contentLength > 0) {
-        return _outgoing.addStream(
-            new Stream.fromFuture(new Future.error(new HttpException(
-                "No content even though contentLength was specified to be "
-                "greater than 0: ${headers.contentLength}.",
-                uri: _uri))));
-      }
-    }
-    return _writeHeaders().whenComplete(_outgoing.close);
-  }
-
   void _writeHeader();
 }
 
 
-class _HttpOutboundConsumer implements StreamConsumer {
-  // TODO(ajohnsen): Once _addStream and _close is merged into _HttpOutgoing,
-  // this class can be removed.
-  _HttpOutboundMessage outbound;
-  _HttpOutboundConsumer();
-
-  Future addStream(var stream) => outbound._addStream(stream);
-  Future close() => outbound._close();
-}
-
-
 class _HttpResponse extends _HttpOutboundMessage<HttpResponse>
     implements HttpResponse {
   int _statusCode = 200;
@@ -597,29 +490,30 @@
 
   int get statusCode => _statusCode;
   void set statusCode(int statusCode) {
-    if (_headersWritten) throw new StateError("Header already sent");
+    if (_outgoing.headersWritten) throw new StateError("Header already sent");
     _statusCode = statusCode;
   }
 
   String get reasonPhrase => _findReasonPhrase(statusCode);
   void set reasonPhrase(String reasonPhrase) {
-    if (_headersWritten) throw new StateError("Header already sent");
+    if (_outgoing.headersWritten) throw new StateError("Header already sent");
     _reasonPhrase = reasonPhrase;
   }
 
   Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY}) {
-    if (_headersWritten) throw new StateError("Header already sent");
+    if (_outgoing.headersWritten) throw new StateError("Header already sent");
     statusCode = status;
     headers.set("location", location.toString());
     return close();
   }
 
   Future<Socket> detachSocket() {
-    if (_headersWritten) throw new StateError("Headers already sent");
+    if (_outgoing.headersWritten) throw new StateError("Headers already sent");
     deadline = null;  // Be sure to stop any deadline.
     var future = _httpRequest._httpConnection.detachSocket();
-    _writeHeaders(drainRequest: false,
-                  setOutgoing: false).then((_) => close());
+    var headersFuture = _outgoing.writeHeaders(drainRequest: false,
+                                               setOutgoing: false);
+    assert(headersFuture == null);
     // Close connection so the socket is 'free'.
     close();
     done.catchError((_) {
@@ -816,13 +710,13 @@
 
   int get maxRedirects => _maxRedirects;
   void set maxRedirects(int maxRedirects) {
-    if (_headersWritten) throw new StateError("Request already sent");
+    if (_outgoing.headersWritten) throw new StateError("Request already sent");
     _maxRedirects = maxRedirects;
   }
 
   bool get followRedirects => _followRedirects;
   void set followRedirects(bool followRedirects) {
-    if (_headersWritten) throw new StateError("Request already sent");
+    if (_outgoing.headersWritten) throw new StateError("Request already sent");
     _followRedirects = followRedirects;
   }
 
@@ -961,8 +855,7 @@
 //
 // Most notable is the GZip compression, that uses a double-buffering system,
 // one before gzip (_gzipBuffer) and one after (_buffer).
-class _HttpOutgoing
-    implements StreamConsumer<List<int>> {
+class _HttpOutgoing implements StreamConsumer<List<int>> {
   static const List<int> _footerAndChunk0Length =
       const [_CharCode.CR, _CharCode.LF, 0x30, _CharCode.CR, _CharCode.LF,
              _CharCode.CR, _CharCode.LF];
@@ -973,6 +866,9 @@
   final Completer _doneCompleter = new Completer();
   final Socket socket;
 
+  bool ignoreBody = false;
+  bool headersWritten = false;
+
   Uint8List _buffer;
   int _length = 0;
 
@@ -996,23 +892,84 @@
 
   _HttpOutboundMessage outbound;
 
-  bool _ignoreError(error)
-    => (error is SocketException || error is TlsException) &&
-       outbound is HttpResponse;
-
   _HttpOutgoing(this.socket);
 
-  Future addStream(Stream<List<int>> stream, [Future pauseFuture]) {
+  // Returns either a future or 'null', if it was able to write headers
+  // immediately.
+  Future writeHeaders({bool drainRequest: true, bool setOutgoing: true}) {
+    Future write() {
+      try {
+        outbound._writeHeader();
+      } catch (_) {
+        // Headers too large.
+        return new Future.error(new HttpException(
+            "Headers size exceeded the of '$_OUTGOING_BUFFER_SIZE'"
+            " bytes"));
+      }
+    }
+    if (headersWritten) return null;
+    headersWritten = true;
+    Future drainFuture;
+    bool isServerSide = outbound is _HttpResponse;
+    bool gzip = false;
+    if (isServerSide) {
+      var response = outbound;
+      if (outbound.headers.chunkedTransferEncoding) {
+        List acceptEncodings =
+            response._httpRequest.headers[HttpHeaders.ACCEPT_ENCODING];
+        List contentEncoding = outbound.headers[HttpHeaders.CONTENT_ENCODING];
+        if (acceptEncodings != null &&
+            acceptEncodings
+                .expand((list) => list.split(","))
+                .any((encoding) => encoding.trim().toLowerCase() == "gzip") &&
+            contentEncoding == null) {
+          outbound.headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
+          gzip = true;
+        }
+      }
+      if (drainRequest && !response._httpRequest._incoming.hasSubscriber) {
+        drainFuture = response._httpRequest.drain().catchError((_) {});
+      }
+    } else {
+      drainRequest = false;
+    }
+    if (ignoreBody) {
+      return write();
+    }
+    if (setOutgoing) {
+      int contentLength = outbound.headers.contentLength;
+      if (outbound.headers.chunkedTransferEncoding) {
+        chunked = true;
+        if (gzip) this.gzip = true;
+      } else if (contentLength >= 0) {
+        this.contentLength = contentLength;
+      }
+    }
+    if (drainFuture != null) {
+      return drainFuture.then((_) => write());
+    }
+    return write();
+  }
+
+
+  Future addStream(Stream<List<int>> stream) {
     if (_socketError) {
       stream.listen(null).cancel();
       return new Future.value(outbound);
     }
+    if (ignoreBody) {
+      stream.drain().catchError((_) {});
+      var future = writeHeaders();
+      if (future != null) {
+        return future.then((_) => close());
+      }
+      return close();
+    }
     var sub;
-    var controller;
     // Use new stream so we are able to pause (see below listen). The
     // alternative is to use stream.extand, but that won't give us a way of
     // pausing.
-    controller = new StreamController(
+    var controller = new StreamController(
         onPause: () => sub.pause(),
         onResume: () => sub.resume(),
         sync: true);
@@ -1050,13 +1007,15 @@
         onError: controller.addError,
         onDone: controller.close,
         cancelOnError: true);
-
-    // While incoming is being drained, the pauseFuture is non-null. Pause
-    // output until it's drained.
-    if (pauseFuture != null) {
-      sub.pause(pauseFuture);
+    // Write headers now that we are listening to the stream.
+    if (!headersWritten) {
+      var future = writeHeaders();
+      if (future != null) {
+        // While incoming is being drained, the pauseFuture is non-null. Pause
+        // output until it's drained.
+        sub.pause(future);
+      }
     }
-
     return socket.addStream(controller.stream)
         .then((_) {
           return outbound;
@@ -1076,56 +1035,82 @@
   Future close() {
     // If we are already closed, return that future.
     if (_closeFuture != null) return _closeFuture;
-    // If we earlier saw an error, return immidiate. The notification to
+    // If we earlier saw an error, return immediate. The notification to
     // _Http*Connection is already done.
     if (_socketError) return new Future.value(outbound);
+    if (!headersWritten && !ignoreBody) {
+      if (outbound.headers.contentLength == -1) {
+        // If no body was written, ignoreBody is false (it's not a HEAD
+        // request) and the content-length is unspecified, set contentLength to
+        // 0.
+        outbound.headers.chunkedTransferEncoding = false;
+        outbound.headers.contentLength = 0;
+      } else if (outbound.headers.contentLength > 0) {
+        var error = new HttpException(
+              "No content even though contentLength was specified to be "
+              "greater than 0: ${outbound.headers.contentLength}.",
+              uri: outbound._uri);
+        _doneCompleter.completeError(error);
+        return _closeFuture = new Future.error(error);
+      }
+    }
     // If contentLength was specified, validate it.
     if (contentLength != null) {
       if (_bytesWritten < contentLength) {
         var error = new HttpException(
             "Content size below specified contentLength. "
             " $_bytesWritten bytes written but expected "
-            "$contentLength.");
+            "$contentLength.",
+            uri: outbound._uri);
         _doneCompleter.completeError(error);
         return _closeFuture = new Future.error(error);
       }
     }
-    // In case of chunked encoding (and gzip), handle remaining gzip data and
-    // append the 'footer' for chunked encoding.
-    if (chunked) {
-      if (_gzip) {
-        _gzipAdd = socket.add;
-        if (_gzipBufferLength > 0) {
-          _gzipSink.add(new Uint8List.view(
-              _gzipBuffer.buffer, 0, _gzipBufferLength));
+
+    Future finalize() {
+      // In case of chunked encoding (and gzip), handle remaining gzip data and
+      // append the 'footer' for chunked encoding.
+      if (chunked) {
+        if (_gzip) {
+          _gzipAdd = socket.add;
+          if (_gzipBufferLength > 0) {
+            _gzipSink.add(new Uint8List.view(
+                _gzipBuffer.buffer, 0, _gzipBufferLength));
+          }
+          _gzipBuffer = null;
+          _gzipSink.close();
+          _gzipAdd = null;
         }
-        _gzipBuffer = null;
-        _gzipSink.close();
-        _gzipAdd = null;
+        _addChunk(_chunkHeader(0), socket.add);
       }
-      _addChunk(_chunkHeader(0), socket.add);
-    }
-    // Add any remaining data in the buffer.
-    if (_length > 0) {
-      socket.add(new Uint8List.view(_buffer.buffer, 0, _length));
-    }
-    // Clear references, for better GC.
-    _buffer = null;
-    // And finally flush it. As we support keep-alive, never close it from here.
-    // Once the socket is flushed, we'll be able to reuse it (signaled by the
-    // 'done' future).
-    return _closeFuture = socket.flush()
-      .then((_) {
-        _doneCompleter.complete(socket);
-        return outbound;
-      }, onError: (error) {
-        _doneCompleter.completeError(error);
-        if (_ignoreError(error)) {
+      // Add any remaining data in the buffer.
+      if (_length > 0) {
+        socket.add(new Uint8List.view(_buffer.buffer, 0, _length));
+      }
+      // Clear references, for better GC.
+      _buffer = null;
+      // And finally flush it. As we support keep-alive, never close it from
+      // here. Once the socket is flushed, we'll be able to reuse it (signaled
+      // by the 'done' future).
+      return socket.flush()
+        .then((_) {
+          _doneCompleter.complete(socket);
           return outbound;
-        } else {
-          throw error;
-        }
-      });
+        }, onError: (error) {
+          _doneCompleter.completeError(error);
+          if (_ignoreError(error)) {
+            return outbound;
+          } else {
+            throw error;
+          }
+        });
+    }
+
+    var future = writeHeaders();
+    if (future != null) {
+      return _closeFuture = future.whenComplete(finalize);
+    }
+    return _closeFuture = finalize();
   }
 
   Future get done => _doneCompleter.future;
@@ -1154,6 +1139,10 @@
     }
   }
 
+  bool _ignoreError(error)
+    => (error is SocketException || error is TlsException) &&
+       outbound is HttpResponse;
+
   void _addGZipChunk(chunk, void add(List<int> data)) {
     if (chunk.length > _gzipBuffer.length - _gzipBufferLength) {
       add(new Uint8List.view(
@@ -1934,7 +1923,7 @@
               }, onError: (_) {
                 destroy();
               });
-          response._ignoreBody = request.method == "HEAD";
+          outgoing.ignoreBody = request.method == "HEAD";
           response._httpRequest = request;
           _httpServer._handleRequest(request);
         },
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 4de80c7..3ae06e9 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -29,6 +29,13 @@
 }
 
 class Isolate {
+  /** Argument to `ping`: Ask for immediate response. */
+  static const int PING_ALIVE = 0;
+  /** Argument to `ping`: Ask for response after control events. */
+  static const int PING_CONTROL = 1;
+  /** Argument to `ping`: Ask for response after normal events. */
+  static const int PING_EVENT = 2;
+
   /**
    * Control port used to send control messages to the isolate.
    *
@@ -40,8 +47,30 @@
    * Capability granting the ability to pause the isolate.
    */
   final Capability pauseCapability;
+  /**
+   * Capability granting the ability to terminate the isolate.
+   */
+  final Capability terminateCapability;
 
-  Isolate._fromControlPort(this.controlPort, [this.pauseCapability]);
+  /**
+   * Create a new [Isolate] object with a restricted set of capabilities.
+   *
+   * The port should be a control port for an isolate, as taken from
+   * another `Isolate` object.
+   *
+   * The capabilities should be the subset of the capabilities that are
+   * available to the original isolate.
+   * Capabilities of an isolate are locked to that isolate, and have no effect
+   * anywhere else, so the capabilities should come from the same isolate as
+   * the control port.
+   *
+   * If all the available capabilities are included,
+   * there is no reason to create a new object,
+   * since the behavior is defined entirely
+   * by the control port and capabilities.
+   */
+  Isolate(this.controlPort, {this.pauseCapability,
+                             this.terminateCapability});
 
   /**
    * Creates and spawns an isolate that shares the same code as the current
@@ -182,6 +211,58 @@
         ..[1] = responsePort;
     controlPort.send(message);
   }
+
+  /**
+   * Set whether uncaught errors will terminate the isolate.
+   *
+   * WARNING: This method is experimental and not handled on every platform yet.
+   *
+   * If errors are fatal, any uncaught error will terminate the isolate
+   * event loop and shut down the isolate.
+   *
+   * This call requires the [terminateCapability] for the isolate.
+   * If the capability is not correct, no change is made.
+   */
+  void setErrorsFatal(bool errorsAreFatal) {
+    var message = new List(3)
+        ..[0] = "set-errors-fatal"
+        ..[1] = terminateCapability
+        ..[2] = errorsAreFatal;
+    controlPort.send(message);
+  }
+
+  /**
+   * Request that the isolate send a response on the [responsePort].
+   *
+   * WARNING: This method is experimental and not handled on every platform yet.
+   *
+   * If the isolate is alive, it will eventually send a `null` response on
+   * the response port.
+   *
+   * The [pingType] must be one of [PING_ALIVE], [PING_CONTROL] or [PING_EVENT].
+   * The response is sent at different times depending on the ping type:
+   *
+   * * `PING_ALIVE`: The the isolate responds as soon as possible.
+   *     The response should happen no later than if sent with `PING_CONTROL`.
+   *     It may be sent earlier if the system has a way to do so.
+   * * `PING_CONTROL`: The response it not sent until all previously sent
+   *     control messages from the current isolate to the receiving isolate
+   *     have been processed. This can be used to wait for
+   *     previously sent control messages.
+   * * `PING_EVENT`: The response is not sent until all prevously sent
+   *     non-control messages from the current isolate to the receiving isolate
+   *     have been processed.
+   *     The ping effectively puts the resonse into the normal event queue after
+   *     previously sent messages.
+   *     This can be used to wait for a another event to be processed.
+   */
+  void ping(SendPort responsePort, [int pingType = PING_ALIVE]) {
+    var message = new List(3)
+        ..[0] = "ping"
+        ..[1] = responsePort
+        ..[2] = pingType;
+    controlPort.send(message);
+  }
 }
 
 /**
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index c822fb3..2f94eb2 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -2,6 +2,8 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+mirrors_used_test: Fail # Issue 17313
+
 identity_test: Fail # Issue 6638
 boolified_operator_test: Fail # Issue 8001
 
diff --git a/tests/corelib/bool_from_environment_default_value_test.dart b/tests/corelib/bool_from_environment_default_value_test.dart
index f412522..1095e0e 100644
--- a/tests/corelib/bool_from_environment_default_value_test.dart
+++ b/tests/corelib/bool_from_environment_default_value_test.dart
@@ -2,11 +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 "dart:isolate";
+
 import "package:expect/expect.dart";
 
-main() {
+void test(port) {
   Expect.isFalse(const bool.fromEnvironment('NOT_FOUND'));
   Expect.isTrue(const bool.fromEnvironment('NOT_FOUND', defaultValue: true));
   Expect.isFalse(const bool.fromEnvironment('NOT_FOUND', defaultValue: false));
   Expect.isNull(const bool.fromEnvironment('NOT_FOUND', defaultValue: null));
+  if (port != null) port.send(null);
+}
+
+main() {
+  test(null);
+  var port = new ReceivePort();
+  Isolate.spawn(test, port.sendPort);
+  port.listen((_) => port.close());
 }
diff --git a/tests/corelib/int_from_environment_default_value_test.dart b/tests/corelib/int_from_environment_default_value_test.dart
index d97145a..4a04e74 100644
--- a/tests/corelib/int_from_environment_default_value_test.dart
+++ b/tests/corelib/int_from_environment_default_value_test.dart
@@ -2,10 +2,20 @@
 // 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:isolate";
+
 import "package:expect/expect.dart";
 
-main() {
+void test(port) {
   Expect.isNull(const int.fromEnvironment('NOT_FOUND'));
   Expect.equals(12345, const int.fromEnvironment('NOT_FOUND',
                                                  defaultValue: 12345));
+  if (port != null) port.send(null);
+}
+
+main() {
+  test(null);
+  var port = new ReceivePort();
+  Isolate.spawn(test, port.sendPort);
+  port.listen((_) => port.close());
 }
diff --git a/tests/corelib/string_from_environment_default_value.dart b/tests/corelib/string_from_environment_default_value.dart
index 3d236e7..b361dd3 100644
--- a/tests/corelib/string_from_environment_default_value.dart
+++ b/tests/corelib/string_from_environment_default_value.dart
@@ -2,10 +2,20 @@
 // 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:isolate";
+
 import "package:expect/expect.dart";
 
-main() {
+void test(port) {
   Expect.isNull(const String.fromEnvironment('NOT_FOUND'));
   Expect.equals('x',
                 const String.fromEnvironment('NOT_FOUND', defaultValue: 'x'));
+  if (port != null) port.send(null);
+}
+
+main() {
+  test(null);
+  var port = new ReceivePort();
+  Isolate.spawn(test, port.sendPort);
+  port.listen((_) => port.close());
 }
diff --git a/tests/html/custom/attribute_changed_callback_test.html b/tests/html/custom/attribute_changed_callback_test.html
index 83697ec..8f54393 100644
--- a/tests/html/custom/attribute_changed_callback_test.html
+++ b/tests/html/custom/attribute_changed_callback_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running attribute_changed_callback_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/constructor_calls_created_synchronously_test.html b/tests/html/custom/constructor_calls_created_synchronously_test.html
index 6bea50e..531162e 100644
--- a/tests/html/custom/constructor_calls_created_synchronously_test.html
+++ b/tests/html/custom/constructor_calls_created_synchronously_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running entered_left_view_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/created_callback_test.html b/tests/html/custom/created_callback_test.html
index da08386..424db1e 100644
--- a/tests/html/custom/created_callback_test.html
+++ b/tests/html/custom/created_callback_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running created_callback_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/document_register_basic_test.html b/tests/html/custom/document_register_basic_test.html
index f956be3..f83837e 100644
--- a/tests/html/custom/document_register_basic_test.html
+++ b/tests/html/custom/document_register_basic_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running document_register_basic_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/document_register_type_extensions_test.html b/tests/html/custom/document_register_type_extensions_test.html
index d0a0fbc..1a0fe01 100644
--- a/tests/html/custom/document_register_type_extensions_test.html
+++ b/tests/html/custom/document_register_type_extensions_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running document_register_type_extensions_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/entered_left_view_test.html b/tests/html/custom/entered_left_view_test.html
index 6bea50e..531162e 100644
--- a/tests/html/custom/entered_left_view_test.html
+++ b/tests/html/custom/entered_left_view_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running entered_left_view_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/js_custom_test.html b/tests/html/custom/js_custom_test.html
index 43c3ffe..c477d92 100644
--- a/tests/html/custom/js_custom_test.html
+++ b/tests/html/custom/js_custom_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running js_custom_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/mirrors_test.html b/tests/html/custom/mirrors_test.html
index 550e43c..0211aea 100644
--- a/tests/html/custom/mirrors_test.html
+++ b/tests/html/custom/mirrors_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running mirrors_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript"
       src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/html/custom/template_wrappers_test.html b/tests/html/custom/template_wrappers_test.html
index ae80497..3af84bb 100644
--- a/tests/html/custom/template_wrappers_test.html
+++ b/tests/html/custom/template_wrappers_test.html
@@ -21,7 +21,7 @@
   </template>
   <x-custom-two></x-custom-two>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   %TEST_SCRIPTS%
 </body>
 </html>
diff --git a/tests/html/custom_elements_test.html b/tests/html/custom_elements_test.html
index 6812767..8c2cd1e 100644
--- a/tests/html/custom_elements_test.html
+++ b/tests/html/custom_elements_test.html
@@ -16,7 +16,7 @@
 <body>
   <h1> Running custom_elements_test </h1>
   <script type="text/javascript"
-      src="/packages/unittest/test_controller.js"></script>
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
   <script type="text/javascript" src="/packages/browser/interop.js"></script>
   %TEST_SCRIPTS%
 </body>
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index a3eb24d..e39b4e4 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -14,6 +14,8 @@
 pause_test: Fail        # Not implemented yet
 start_paused_test: Fail # Not implemented yet
 ondone_test: Skip       # Not implemented yet, hangs.
+ping_test: Fail         # Not implemented yet
+ping_pause_test: Fail   # Not implemented yet
 
 [ $compiler == dart2js && $jscl ]
 browser/*: SkipByDesign  # Browser specific tests
diff --git a/tests/isolate/ping_pause_test.dart b/tests/isolate/ping_pause_test.dart
new file mode 100644
index 0000000..11fa951
--- /dev/null
+++ b/tests/isolate/ping_pause_test.dart
@@ -0,0 +1,49 @@
+// 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:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    if (v == 0) port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  asyncStart();
+  var completer = new Completer();  // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    List result = [];
+    completer.future.then((echoPort) {
+      reply.handler = (v) {
+        result.add(v);
+        if (v == 0) {
+          Expect.listEquals([4, 3, 2, 1, 0], result);
+          reply.close();
+          asyncEnd();
+        }
+      };
+      echoPort.send(4);
+      echoPort.send(3);
+      Capability resume = isolate.pause();
+      var pingPort = new RawReceivePort();
+      pingPort.handler = (_) {
+        Expect.isTrue(result.length <= 2);
+        echoPort.send(0);
+        isolate.resume(resume);
+        pingPort.close();
+      };
+      isolate.ping(pingPort.sendPort, Isolate.PING_CONTROL);
+      echoPort.send(2);
+      echoPort.send(1);
+    });
+  });
+}
diff --git a/tests/isolate/ping_test.dart b/tests/isolate/ping_test.dart
new file mode 100644
index 0000000..e208189
--- /dev/null
+++ b/tests/isolate/ping_test.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.
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    if (v == 0) port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main(){
+  asyncStart();
+  var completer = new Completer();  // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    List result = [];
+    completer.future.then((echoPort) {
+      reply.handler = (v) {
+        result.add(v);
+        if (v == 0) {
+          Expect.listEquals(["alive", "control", "event"],
+                            result.where((x) => x is String).toList());
+          Expect.listEquals([4, 3, 2, 1, 0],
+                            result.where((x) => x is int).toList());
+          Expect.isTrue(result.indexOf("alive") < result.indexOf(3));
+          Expect.isTrue(result.indexOf("control") < result.indexOf(2));
+          int eventIndex = result.indexOf("event");
+          Expect.isTrue(eventIndex > result.indexOf(2));
+          Expect.isTrue(eventIndex < result.indexOf(1));
+          reply.close();
+          asyncEnd();
+        }
+      };
+      echoPort.send(4);
+      SendPort createPingPort(message) {
+        var pingPort = new RawReceivePort();
+        pingPort.handler = (_) {
+          result.add(message);
+          pingPort.close();
+        };
+        return pingPort.sendPort;
+      }
+      isolate.ping(createPingPort("alive"), Isolate.PING_ALIVE);
+      echoPort.send(3);
+      isolate.ping(createPingPort("control"), Isolate.PING_CONTROL);
+      echoPort.send(2);
+      isolate.ping(createPingPort("event"), Isolate.PING_EVENT);
+      echoPort.send(1);
+      echoPort.send(0);
+    });
+  });
+}
diff --git a/tests/language/vm/load_to_load_forwarding_vm_test.dart b/tests/language/vm/load_to_load_forwarding_vm_test.dart
index 18cd44c..be99d88 100644
--- a/tests/language/vm/load_to_load_forwarding_vm_test.dart
+++ b/tests/language/vm/load_to_load_forwarding_vm_test.dart
@@ -268,6 +268,23 @@
 }
 var indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
 
+class Z {
+  var x = 42;
+}
+
+var global_array = new List<Z>(1);
+
+side_effect() {
+  global_array[0].x++;
+}
+
+testAliasingStoreIndexed(array) {
+  var z = new Z();
+  array[0] = z;
+  side_effect();
+  return z.x;
+}
+
 main() {
   final fixed = new List(10);
   final growable = [];
@@ -332,4 +349,9 @@
   for (var i = 0; i < 20; i++) {
     Expect.equals(4, testIndexedAliasedStore2(array, array, indices[1]));
   }
+
+  var test_array = new List(1);
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(43, testAliasingStoreIndexed(global_array));
+  }
 }
diff --git a/tests/standalone/io/http_head_test.dart b/tests/standalone/io/http_head_test.dart
index 4874e47..647fc9b 100644
--- a/tests/standalone/io/http_head_test.dart
+++ b/tests/standalone/io/http_head_test.dart
@@ -56,7 +56,6 @@
       client.open("HEAD", "127.0.0.1", server.port, "/testChunked$len")
         .then((request) => request.close())
         .then((HttpClientResponse response) {
-            print(response.headers);
           Expect.equals(-1, response.contentLength);
           response.listen(
             (_) => Expect.fail("Data from HEAD request"),
diff --git a/tests/standalone/vmservice/isolate_bad_object_test.dart b/tests/standalone/vmservice/isolate_bad_object_test.dart
index d22ba64..8d156f6 100644
--- a/tests/standalone/vmservice/isolate_bad_object_test.dart
+++ b/tests/standalone/vmservice/isolate_bad_object_test.dart
@@ -13,7 +13,7 @@
       super('http://127.0.0.1:$port/$id/objects/50');
 
   onRequestCompleted(Map reply) {
-    Expect.equals('null', reply['type']);
+    Expect.equals('Null', reply['type']);
   }
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index 6cbf9bf..6acf62f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 3
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 51b92df..44366db 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -82,13 +82,16 @@
          /{index.html,features/,plugins/,artifacts.jar,content.jar}
   """
   def __init__(self, channel=Channel.BLEEDING_EDGE,
-      release_type=ReleaseType.RAW):
+      release_type=ReleaseType.RAW, internal=False):
     assert channel in Channel.ALL_CHANNELS
     assert release_type in ReleaseType.ALL_TYPES
 
     self.channel = channel
     self.release_type = release_type
-    self.bucket = 'gs://dart-archive'
+    if internal:
+      self.bucket = 'gs://dart-archive-internal'
+    else:
+      self.bucket = 'gs://dart-archive'
 
   # Functions for quering complete gs:// filepaths
 
@@ -116,11 +119,18 @@
     return '/'.join([self.apidocs_directory(revision),
       self.apidocs_zipfilename()])
 
+  def dartium_android_apk_filepath(self, revision, name, arch, mode):
+    return '/'.join([self.dartium_android_directory(revision),
+      self.dartium_android_apk_filename(name, arch, mode)])
+
   # Functions for querying gs:// directories
 
   def dartium_directory(self, revision):
     return self._variant_directory('dartium', revision)
 
+  def dartium_android_directory(self, revision):
+    return self._variant_directory('dartium_android', revision)
+
   def sdk_directory(self, revision):
     return self._variant_directory('sdk', revision)
 
@@ -142,6 +152,9 @@
 
   # Functions for quering filenames
 
+  def dartium_android_apk_filename(self, name, arch, mode):
+    return '%s-%s-%s.apk' % (name, arch, mode)
+
   def apidocs_zipfilename(self):
     return 'dart-api-docs.zip'
 
@@ -249,6 +262,14 @@
     args += [local_path, remote_path]
     self.execute(args)
 
+  def setGroupReadACL(self, remote_path, group):
+    args = ['acl', 'ch', '-g', '%s:R' % group, remote_path]
+    self.execute(args)
+
+  def setContentType(self, remote_path, content_type):
+    args = ['setmeta', '-h', 'Content-Type:%s' % content_type, remote_path]
+    self.execute(args)
+
   def remove(self, remote_path, recursive=False):
     assert remote_path.startswith('gs://')
 
diff --git a/tools/bots/dartium_android.py b/tools/bots/dartium_android.py
index 3287dfc..7fd4af4 100644
--- a/tools/bots/dartium_android.py
+++ b/tools/bots/dartium_android.py
@@ -11,8 +11,21 @@
 Dart and chromium tests on it.
 """
 
-import sys
 import optparse
+import os
+import string
+import sys
+
+import bot
+import bot_utils
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(os.path.join(SCRIPT_DIR, '..'))
+import utils
+
+
+APK_LOCATION = 'apks/Chrome.apk'
+CS_LOCATION = 'apks/ContentShell.apk'
 
 def GetOptionsParser():
   parser = optparse.OptionParser("usage: %prog [options]")
@@ -20,6 +33,43 @@
                     help="The directory containing the products of the build.")
   return parser
 
+
+def UploadSetACL(gsutil, local, remote):
+  gsutil.upload(local, remote)
+  gsutil.setGroupReadACL(remote, 'google.com')
+  gsutil.setContentType(remote, 'application/vnd.android.package-archive')
+  
+
+def UploadAPKs(options):
+  with bot.BuildStep('Upload apk'):
+    revision = utils.GetSVNRevision()
+    namer = bot_utils.GCSNamer(internal=True)
+    gsutil = bot_utils.GSUtil()
+
+
+    # Archive dartuim
+    local = os.path.join(options.build_products_dir, APK_LOCATION)
+    # TODO(whesse): pass in arch and mode from reciepe
+    remote = namer.dartium_android_apk_filepath(revision,
+                                                'dartium-android',
+                                                'arm',
+                                                'release')
+    web_link_prefix = 'https://storage.cloud.google.com/'
+    dartium_link = string.replace(remote, 'gs://', web_link_prefix)
+    UploadSetACL(gsutil, local, remote)
+    print "Uploaded dartium, available from: %s" % dartium_link
+
+    # Archive content shell
+    local = os.path.join(options.build_products_dir, CS_LOCATION)
+    # TODO(whesse): pass in arch and mode from reciepe
+    remote = namer.dartium_android_apk_filepath(revision,
+                                                'content_shell-android',
+                                                'arm',
+                                                'release')
+    content_shell_link = string.replace(remote, 'gs://', web_link_prefix)
+    UploadSetACL(gsutil, local, remote)
+    print "Uploaded content shell, available from: %s" % content_shell_link
+
 def main():
   if sys.platform != 'linux2':
     print "This script was only tested on linux. Please run it on linux!"
@@ -29,7 +79,11 @@
   (options, args) = parser.parse_args()
 
   if not options.build_products_dir:
-    die("No build products directory given.")
+    print "No build products directory given."
+    sys.exit(1)
+
+  # Reenable once we have new gsutil working
+  # UploadAPKs(options)
   sys.exit(0)
 
 if __name__ == '__main__':
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index b33973a..da571a3 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -12,7 +12,7 @@
 interface WaveShaperNode {
   // TODO(ager): Auto-generate this custom method when the info about retaining
   // typed arrays is in the IDL.
-  [CustomSetter] attribute Float32Array curve;
+  [Custom=Setter] attribute Float32Array curve;
 };
 
 [Supplemental]
@@ -328,20 +328,20 @@
 
 [Supplemental]
 interface Location {
-  [CustomSetter] attribute DOMString href;
+  [Custom=Setter] attribute DOMString href;
 
   [Custom] void assign(optional DOMString url);
   [Custom] void replace([Default=Undefined] optional DOMString url);
   [Custom] void reload();
 
   // URI decomposition attributes
-  [CustomSetter] attribute DOMString protocol;
-  [CustomSetter] attribute DOMString host;
-  [CustomSetter] attribute DOMString hostname;
-  [CustomSetter] attribute DOMString port;
-  [CustomSetter] attribute DOMString pathname;
-  [CustomSetter] attribute DOMString search;
-  [CustomSetter] attribute DOMString hash;
+  [Custom=Setter] attribute DOMString protocol;
+  [Custom=Setter] attribute DOMString host;
+  [Custom=Setter] attribute DOMString hostname;
+  [Custom=Setter] attribute DOMString port;
+  [Custom=Setter] attribute DOMString pathname;
+  [Custom=Setter] attribute DOMString search;
+  [Custom=Setter] attribute DOMString hash;
 };
 
 // TODO(jacobr): reenable these new Blink features.
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 36f73cc..3ddefdb 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -579,7 +579,12 @@
     type_info = self._TypeInfo(attr.type.id)
     dart_declaration = '%s get %s' % (
         self.SecureOutputType(attr.type.id, False, read_only), html_name)
-    is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs
+    is_custom = ('Custom' in attr.ext_attrs and
+                 (attr.ext_attrs['Custom'] == None or
+                  attr.ext_attrs['Custom'] == 'Getter'))
+    # This seems to have been replaced with Custom=Getter (see above), but
+    # check to be sure we don't see the old syntax
+    assert(not ('CustomGetter' in attr.ext_attrs))
     native_suffix = 'Getter'
     auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
@@ -623,7 +628,13 @@
   def _AddSetter(self, attr, html_name):
     type_info = self._TypeInfo(attr.type.id)
     dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr.type.id))
-    is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext_attrs)
+    is_custom = ('Custom' in attr.ext_attrs and
+                 (attr.ext_attrs['Custom'] == None or
+                  attr.ext_attrs['Custom'] == 'Setter'))
+    # This seems to have been replaced with Custom=Setter (see above), but
+    # check to be sure we don't see the old syntax
+    assert(not ('CustomSetter' in attr.ext_attrs))
+    assert(not ('V8CustomSetter' in attr.ext_attrs))
     native_suffix = 'Setter'
     auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 80b97d0..8c66ac1 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -1419,22 +1419,24 @@
 
         var parsedData = parseResult(msg);
         if (parsedData) {
-          // Only if the JSON was valid, we'll post it back.
-          var message = parsedData['message'];
-          var isFirstMessage = parsedData['is_first_message'];
-          var isStatusUpdate = parsedData['is_status_update'];
-          var isDone = parsedData['is_done'];
-          if (!isFirstMessage && !isStatusUpdate) {
-            if (!isDone) {
-              alert("Bug in test_controller.js: " +
-                    "isFirstMessage/isStatusUpdate/isDone were all false");
+          // Only if the JSON message contains all required parameters,
+          // will we handle it and post it back to the test controller.
+          if ('message' in parsedData &&
+              'is_first_message' in parsedData &&
+              'is_status_update' in parsedData &&
+              'is_done' in parsedData) {
+            var message = parsedData['message'];
+            var isFirstMessage = parsedData['is_first_message'];
+            var isStatusUpdate = parsedData['is_status_update'];
+            var isDone = parsedData['is_done'];
+            if (!isFirstMessage && !isStatusUpdate) {
+              if (!isDone) {
+                alert("Bug in test_controller.js: " +
+                      "isFirstMessage/isStatusUpdate/isDone were all false");
+              }
             }
-          }
-          if (message) {
             reportMessage(message, isFirstMessage, isStatusUpdate);
           }
-        } else {
-          reportMessage(msg, msg == 'STARTING', false);
         }
       }
 
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index abe30ed..891a33b 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -16,7 +16,8 @@
     CompilationCommand;
 
 import 'test_suite.dart' show
-    TestInformation;
+    TestInformation,
+    TestUtils;
 
 /// Grouping of a command with its expected result.
 class CommandArtifact {
@@ -124,6 +125,7 @@
 
   List<String> computeRuntimeArguments(
       RuntimeConfiguration runtimeConfiguration,
+      String buildDir,
       TestInformation info,
       List<String> vmOptions,
       List<String> sharedOptions,
@@ -148,6 +150,7 @@
 
   List<String> computeRuntimeArguments(
       RuntimeConfiguration runtimeConfiguration,
+      String buildDir,
       TestInformation info,
       List<String> vmOptions,
       List<String> sharedOptions,
@@ -176,7 +179,7 @@
           isHostChecked: isHostChecked, useSdk: useSdk);
 
   String computeCompilerPath(String buildDir) {
-    var prefix = 'sdk/bin/';
+    var prefix = 'sdk/bin';
     String suffix = executableScriptSuffix;
     if (isHostChecked) {
       // The script dart2js_developer is not included in the
@@ -262,6 +265,23 @@
         isCsp ? cspOutput : normalOutput,
         'application/javascript');
   }
+
+  List<String> computeRuntimeArguments(
+      RuntimeConfiguration runtimeConfiguration,
+      String buildDir,
+      TestInformation info,
+      List<String> vmOptions,
+      List<String> sharedOptions,
+      List<String> originalArguments,
+      CommandArtifact artifact) {
+    Uri sdk = useSdk ?
+        nativeDirectoryToUri(buildDir).resolve('dart-sdk/') :
+        nativeDirectoryToUri(TestUtils.dartDir().toNativePath())
+                                                .resolve('sdk/');
+    Uri preambleDir = sdk.resolve('lib/_internal/lib/preambles/');
+    return runtimeConfiguration.dart2jsPreambles(preambleDir)
+        ..add(artifact.filename);
+  }
 }
 
 /// Configuration for dart2dart compiler.
@@ -298,6 +318,7 @@
 
   List<String> computeRuntimeArguments(
       RuntimeConfiguration runtimeConfiguration,
+      String buildDir,
       TestInformation info,
       List<String> vmOptions,
       List<String> sharedOptions,
@@ -352,6 +373,7 @@
 
   List<String> computeRuntimeArguments(
       RuntimeConfiguration runtimeConfiguration,
+      String buildDir,
       TestInformation info,
       List<String> vmOptions,
       List<String> sharedOptions,
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index fd30dd9..3fa2ef3 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -76,6 +76,8 @@
     // TODO(ahe): Make this method abstract.
     throw "Unimplemented runtime '$runtimeType'";
   }
+
+  List<String> dart2jsPreambles(Uri preambleDir) => [];
 }
 
 /// The 'none' runtime configuration.
@@ -124,6 +126,10 @@
         commandBuilder.getJSCommandlineCommand(
             moniker, suite.d8FileName, arguments, environmentOverrides)];
   }
+
+  List<String> dart2jsPreambles(Uri preambleDir) {
+    return [preambleDir.resolve('d8.js').toFilePath()];
+  }
 }
 
 /// Firefox/SpiderMonkey-based development shell (jsshell).
@@ -142,6 +148,10 @@
         commandBuilder.getJSCommandlineCommand(
             moniker, suite.jsShellFileName, arguments, environmentOverrides)];
   }
+
+  List<String> dart2jsPreambles(Uri preambleDir) {
+    return ['-f', preambleDir.resolve('jsshell.js').toFilePath(), '-f'];
+  }
 }
 
 /// Common runtime configuration for runtimes based on the Dart VM.
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index af7490b..4937643 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -994,6 +994,7 @@
     List<String> runtimeArguments =
         compilerConfiguration.computeRuntimeArguments(
             runtimeConfiguration,
+            buildDir,
             info,
             vmOptions, sharedOptions, args,
             compilationArtifact);